[英]Father process was block while set SIGCHLD
这是我的代码,我已经简化了它。
#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)
?
我为我的英语不好对不起!
我看不到为什么父进程会挂起,并且它不在我的计算机上。
在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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.