【发布时间】:2018-01-31 00:36:14
【问题描述】:
我不知道为什么我的电脑会出现这样的错误。我已经在其他一些计算机上测试了代码。效果很好。
如果我删除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");
}
【问题讨论】:
标签: c unix operating-system