这是我的代码,我简化了它。
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
void signal_handle(int sig)
{
int status;
wait(&status);
}
int main()
{
pid_t pid = fork();
if (pid > 0)
signal(SIGCHLD, signal_handle);
if (pid == 0) {
if (execl("/bin/ls", "/", (char *)0) < 0)
{
perror("execl");
return -1;
}
}
return 0;
}
当我运行它时,我发现,子进程打印运行结果,但父进程 被封锁了。
如果一个父亲有很多儿子过程,我该怎么办?为每个人设置wait(&status)
?
我很抱歉我的英语不好!
答案 0 :(得分:1)
我不明白为什么父进程会挂起,而且它不在我的机器上。
在fork()
之后,父进程调用signal()
来设置信号处理程序并立即退出。同时,子进程ls
执行打印当前目录的内容(因为"/"
参数变为argv[0]
,程序名称,并且没有其他参数)。它然后退出。除非在非常不可能的情况下,父母已经在孩子完成之前很久就离开了。
如果您希望父进程等到“孩子死亡”信号,请在仅父执行路径中添加对pause()
的调用:
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
static void signal_handle(int sig)
{
int status;
pid_t pid = wait(&status);
printf("%d: signal %d child %d status 0x%.4X\n", (int)getpid(), sig, (int)pid, status);
}
int main(void)
{
pid_t pid = fork();
if (pid > 0)
{
signal(SIGCHLD, signal_handle);
pause();
}
else if (pid == 0)
{
execl("/bin/ls", "ls", "/", (char *)0);
perror("execl");
return -1;
}
else
perror("fork");
return 0;
}