刚刚与子进程块中的父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",pid); } exit(EXIT_SUCCESS); }
输出:
父母的pid = 2642,小孩= 2643
pid in child = 2643,parent = 1
在“高级Unix编程”中,它表示子进程可以使用getppid()函数获取父进程id.但在这里我得到“1”,这是“init”进程ID.
我在“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",getppid()); } else{ printf("pid in parent=%d and childid=%d\n",pid); } int status = -1; waitpid(pid,&status,WEXITED); printf("The child exited with return code %d\n",status); exit(EXIT_SUCCESS); }