[英]Waitpid and fork/exec's non-blocking advantage over a syscall?
我總是聽到您永遠不要使用system()
,而應該使用fork/exec
因為system()會阻止父進程。
如果是這樣,我是否通過調用waitpid()
做錯了事,當我執行fork/exec
時, waitpid()
也阻塞了父進程? 有沒有辦法解決waitpid
...我一直認為在進行fork/exec
時有必要。
pid_t pid = fork();
if (pid == -1)
{
// failed to fork
}
else if (pid > 0)
{
int status;
waitpid(pid, &status, 0);
}
else
{
execve(...);
}
如果您想在子進程關閉時做其他事情,則可以為SIGCHLD設置陷阱,以處理子進程的完成/退出。 就像在這個非常簡單的示例中一樣。
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
pid_t pid;
int finished=0;
void zombie_hunter(int sig)
{
int status;
waitpid(pid, &status, 0);
printf("Got status %d from child\n",status);
finished=1;
}
int main(void)
{
signal(SIGCHLD,zombie_hunter);
pid = fork();
if (pid == -1)
{
exit(1);
}
else if (pid == 0)
{
sleep(10);
exit(0);
}
while(!finished)
{
printf("waiting...\n");
sleep(1);
}
}
我總是聽到您永遠不要使用
system()
,而應該使用fork/exec
因為system()會阻止父進程。
永遠不要把話說絕了。 如果system()
具有您想要的語義,包括但不限於阻止調用過程,則請務必使用它! 不過,請確保您了解所有這些語義。
如果您的目標是避免阻塞父進程,那么了解父進程可以在派生孩子與通過其中的一個wait()
函數集進行收集之間執行無窮的工作量,這一點很重要。 這非常類似於啟動新線程,繼續進行其他工作,然后最終加入線程。
而且,如果父母不需要知道或關心孩子何時終止,那么就可以完全避免等待。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.