设置SIGCHLD时父进程被阻塞

时间:2012-05-31 05:49:08

标签: c linux process signals fork

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

#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)

我很抱歉我的英语不好!

1 个答案:

答案 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;
}