我不确定为什么我的电脑会出现这样的错误。我在其他一些计算机上测试了代码。效果很好。
如果我删除sleep(2)
,它就可以了。我想我应该能够为僵尸进程设置PGID。它是否依赖于操作系统的实现?
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#define CHECK(syscall, msg) do { \
if ((syscall) == -1) { \
perror(msg); \
_exit(1); \
} \
} while(0)
#define SAFE_CLOSE_NOT_STD(fd) do { \
if (fd != STDIN_FILENO && fd != STDOUT_FILENO && fd != -1) { \
CHECK(close(fd), "close error"); \
fd = -1; \
} \
} while(0)
int main () {
int ls_pid;
char *ls_argv[] = { "ls", NULL };
CHECK(ls_pid = fork(), "fork error");
if (!ls_pid) {
CHECK(setpgid(0, 0), "child setpgid error");
CHECK(execvp(ls_argv[0], ls_argv), "execve error");
} else {
printf("child pid:%d\n", ls_pid);
sleep(2); // no error arises if I remove this line
CHECK(setpgid(ls_pid, ls_pid), "setpgid error"); // error here
}
CHECK(wait(NULL), "wait error");
printf("Finish\n");
}
答案 0 :(得分:1)
睡眠时出错,因为子进程已退出且不再存在。除了调用wait
之外,您无法对僵尸进程执行任何操作。
答案 1 :(得分:0)
当sleep
执行时parents
发生切换到child
进程,而子进程execvp
替换当前进程时,会更新当前进程并退出。在2 seconds
子进程不存在之后回到父进程时,为什么setpgid
失败。
CHECK(setpgid(ls_pid, ls_pid), "setpgid error");
正如您在setpgid
的手册页中看到的那样,EACCES
错误
尝试更改进程组ID 呼叫过程中的一个孩子和 孩子已经执行了一个execve(2)(setpgid(), 的setpgrp())。