【问题标题】:Return value of waitpidwaitpid 的返回值
【发布时间】:2018-09-20 09:31:19
【问题描述】:

我正在使用 waitpid(2) 来检查和标记我的作业控制程序的进程状态。我正在使用 WUNTRACED 选项,在作业控制程序中捕获有用的信号,例如 SIGTSTP。

问题是,当我的程序使用 CTRL-Z (SIGTSTP) 时,waitpid(2) 返回的 PID 是正确的 (>0),但是当使用 CTRL-C (SIGINT) 杀死它时,返回的 PID 是 - 1.那个怎么样 ?那么如何标记我的进程状态呢?因为它返回一个无效的 PID 并将 errno 设置为 ECHILD。

#include <sys/types.h>
#include <stdbool.h>
#include <termios.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>

int     main(void)
{
    pid_t   pid;
    pid_t   ret;
    int     stat_loc;

    if ((!(pid = fork())))
    {
        execve("/bin/ls", (char *const []){"ls", "-Rl", "/", NULL}, NULL);
    }
    else if (pid > 0)
    {
        signal(SIGINT, SIG_IGN);
        signal(SIGQUIT, SIG_IGN);
        signal(SIGTSTP, SIG_IGN);
        signal(SIGTTIN, SIG_IGN);
        signal(SIGTTOU, SIG_IGN);
        signal(SIGCHLD, SIG_IGN);
        ret = waitpid(-1, &stat_loc, WUNTRACED);
        printf("\nwaitpid returned %d\n", ret);
    }
    return (0);
}

编辑:问题解决了,当你忽略它时,看看 SIGCHLD 的技巧。

【问题讨论】:

  • waitpid 出错时返回 -1,执行 perror("waitpid") 看看为什么 waitpid 失败
  • 看清楚手册,-1并不总是错误。
  • 我的手册页说:返回值:waitpid(); ... 出错时,返回 -1。 所以是的,我没看错,waitpid 失败(因此返回 -1),因为您忽略了 SIGCHILD,请参阅 Andrew 的回答。虽然我必须承认我不知道它失败的原因。

标签: c linux unix system wait


【解决方案1】:

你忽略了SIGCHLD

signal(SIGCHLD, SIG_IGN);

Per POSIX:

应生成过程的状态信息(提供给 父进程)当进程停止、继续或终止时 以下情况除外:

  • 如果父进程将SIGCHLD 信号的操作设置为SIG_IGN,或者如果父进程将SA_NOCLDWAIT 标志设置为 SIGCHLD 信号动作,进程终止不应产生新的 状态信息,但应导致任何现有的状态信息 要丢弃的进程。

如果你想在子进程上wait(),你不能忽略SIGCHLD

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多