繁体   English   中英

设置SIGCHLD时,父进程被阻止

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM