子进程和父进程ID

刚刚与子进程块中的父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 = 2642,子级= 2643

子元素中的pid = 2643,父元素= 1

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

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

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

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

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

一旦父完成执行并且子节点仍在运行。 然后,child被称为orphan(因为它的父级已经死亡),如果您通过root(其pid = 1)登录,它将被init进程采用。

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

 #include  #include  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); } } 

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