0

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

#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)为每个人设置?

我很抱歉我的英语不好!

4

1 回答 1

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;
}
于 2012-05-31T06:17:47.273 回答