gpt4 book ai didi

c - 父进程在设置 SIGCHLD 时被阻塞

转载 作者:太空宇宙 更新时间:2023-11-04 11:31:51 29 4
gpt4 key购买 nike

这是我的代码,我已经简化了它。

#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()设置信号处理器并立即退出。与此同时, child 执行 ls 打印当前目录的内容(因为 "/" 参数变成了 argv[0],程序名称,并且没有其他参数)。然后它也退出。除非在极不可能的情况下, parent 在 child 完成之前就已经退出了。

如果您希望父进程等待直到它收到“子进程死亡”信号,请在仅父进程的执行路径中添加对 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;
}

关于c - 父进程在设置 SIGCHLD 时被阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10828081/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com