【问题标题】:Father process was block while set SIGCHLD父进程在设置 SIGCHLD 时被阻塞
【发布时间】:2012-05-31 05:49:07
【问题描述】:

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

#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(&amp;status)

我很抱歉我的英语不好!

【问题讨论】:

  • 您不需要测试execl()exec*() 函数的任何其他成员的状态。如果返回,则失败;如果成功,则不会返回。
  • 你应该多看execl的手册页,电话应该是execl("/bin/ls", "ls", "/", NULL);
  • 写的(有点)没问题;它告诉ls 程序它的名字是/ 并且ls 列出了当前目录,因为它没有文件名参数。 (但你是对的;这可能不是本意。)

标签: c linux process signals fork


【解决方案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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 2017-01-22
    • 1970-01-01
    相关资源
    最近更新 更多