【发布时间】: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 的回答。虽然我必须承认我不知道它失败的原因。