2016-10-02 47 views
2

在这个程序中,为什么子进程打印错误ppid()?子进程打印出错ppid()

#include<stdio.h> 
#include<stdlib.h> 
#include<unistd.h> 

void childprocess() 
{ 
    printf("Child: Hi I am the child process\n"); 
    printf("Child: My process id is %d\n", getpid()); 
    printf("Child: My parent is %d\n", getppid()); 
    printf("Child: I am exiting\n"); 
} 

void parentprocess() 
{ 
    printf("Parent: Hi I am the parent process\n"); 
    printf("Parent: My process id is %d\n", getpid()); 
    printf("Parent: My parent is %d\n", getppid()); 
    printf("Parent: I am exiting\n"); 
} 

int main() 
{ 
    pid_t n = fork(); 
    if(n<0) 
    { 
     perror("fork failed:"); 
     exit(EXIT_FAILURE); 
    } 
    else if(n==0) 
     childprocess(); 
    else 
     parentprocess(); 
} 

输出:

Parent: Hi I am the parent process 
Parent: My process id is 21550 
Parent: My parent is 7452 
Parent: I am exiting 
Child: Hi I am the child process 
Child: My process id is 21551 
Child: My parent is 1810 
Child: I am exiting 

如果我重新执行。有时输出是我所期望的,有时却是意想不到的。

+1

尝试添加一些sleep();在父进程中,我想你会得到你所期望的。这个问题可能是https://en.wikipedia.org/wiki/Orphan_process –

回答

1

找到原因了。那真是愚蠢。父节点首先结束,所以子节点(孤儿)正在被init进程采纳。

在我的情况下,它是进程ID为1810

暴发户了Upstart是一个基于事件的替换老的/ sbin目录/初始化

1

事实上,也没有保证调度将首先安排儿子进程。在子进程运行之前,父进程可能会终止。而且,由于在Linux中每个进程都有一个父进程(交换进程除外),孤儿孩子被分配给init。

您可以添加wait(),以便父进程等待子进程。