子进程的setpgid:没有这样的进程

时间:2018-01-31 00:36:15

标签: c unix operating-system

我不确定为什么我的电脑会出现这样的错误。我在其他一些计算机上测试了代码。效果很好。

如果我删除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");
}

2 个答案:

答案 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())。