子进程和父进程ID

时间:2013-08-09 19:32:03

标签: c fork pid

刚刚与子进程块中的父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

pid in child = 2643 and parent = 1

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

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

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

5 个答案:

答案 0 :(得分:4)

那是因为父亲可以/将在儿子面前退出。如果父亲在没有请求其子项的返回值的情况下存在,则该子进程将由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);
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分: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);
  }
}

答案 4 :(得分:-1)

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