6

只是对子进程块中的父 pid 值感到困惑。我的程序如下:

 int main(int argc, char *argv[])
  {
    pid_t pid;
    pid=fork();
    if(pid==-1){
            perror("fork failure");
            exit(EXIT_FAILURE);
    }
    else if(pid==0){
            printf("pid in child=%d and parent=%d\n",getpid(),getppid()); 
    }
    else{
            printf("pid in parent=%d and childid=%d\n",getpid(),pid);
    }
    exit(EXIT_SUCCESS);
  }

输出:pid in parent=2642 and childid=2643

孩子 = 2643 和父母 = 1 中的 pid

在“高级 Unix 编程”中,它说子进程可以使用 getppid() 函数获取父进程 ID。但在这里我得到“1”,即“init”进程ID。

如何在子进程块中获取父 pid 值。请帮助我获取输出。

我在“Linux Mint OS”中执行,但在“WindRiver”操作系统中我没有遇到这个问题。该程序是否会根据操作系统改变行为?

4

5 回答 5

6

那是因为父亲可以/将在儿子之前退出。如果父亲在没有请求其孩子的返回值的情况下存在,则孩子将由 pid=1 的进程拥有。经典 UNIX 或 GNU 系统 SystemV init 上有什么。

解决方案是waitpid()在父亲中使用:

int main(int argc, char *argv[])
{
    pid_t pid;
    pid=fork();
    if(pid==-1){
        perror("fork failure");
        exit(EXIT_FAILURE);
    }
    else if(pid==0){
        printf("pid in child=%d and parent=%d\n",getpid(),getppid()); 
    }
    else{
        printf("pid in parent=%d and childid=%d\n",getpid(),pid);
    }

    int status = -1;
    waitpid(pid, &status, WEXITED);

    printf("The child exited with return code %d\n", status);
    exit(EXIT_SUCCESS);
}
于 2013-08-09T19:35:58.837 回答
0

在分叉之后,您有两个新进程,您可以知道父进程中的子 ID,但反之则不行。如果你真的需要这个,你必须在 fork 之前打开一个管道(popen),然后父母可以将它写入管道并且孩子可以读取它。

于 2013-08-09T19:35:46.140 回答
0

一旦父母完成它执行并且孩子仍在运行。然后孩子被称为孤儿(因为它的父母已经死了),如果您以 root 登录(其 pid =1 ),它将被 init 进程采用。

如果您希望孩子在父母之前先退出,请使用 wait() 系统调用及其变体。

于 2017-03-26T17:52:59.957 回答
0
#include <stdio.h>
#include <unistd.h>

int main()
{
  int pid,pid2;
  pid=fork();

  if (pid<0) {
    printf("fork failed");
    exit(-1);
  } else if (pid==0) {
    printf("child id is%d",getpid());
    execlp("/bin/ls","is",NULL);
    printf("\nsleeping for 2 seconds using pid of child class");
    sleep(2);

    printf("killing the child process");
    kill(getpid());
  } else {
    wait(NULL);
    printf("The parent id is %d\n",getpid());
    printf("The child id is %d\n",getpid());
    printf("\nsleeping for 3 seconds without pid");
    sleep(3);
    printf("\nchild completed\n");

    exit(0);
  }
}
于 2017-09-12T04:36:15.660 回答
-1

很简单,因为父进程不再存在。如果你调用wait()系统函数,那么它会一直存在,直到子进程完成它的工作,你会得到父进程的 PID。

于 2018-03-18T12:25:19.183 回答