刚刚与子进程块中的父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”操作系统中我没有遇到这个问题。该程序是否根据操作系统改变了行为?
答案 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。