2015-09-25 122 views
0

我在書本中以及在子進程的PID分配給其父一些網上論壇上閱讀。但是,我有這樣的代碼:是否將子進程pid()分配給父進程?

#include<stdio.h> 
#include<unistd.h> 
#include<sys/types.h> 
int main() 
{ 
    pid_t pid; 
    pid=fork(); 
    if(pid==0) 
     { 
      printf("In Child Process\n"); 
      printf("Child process PID : %d\n",getpid()); 
      printf("Parent Process PID : %d\n",getppid()); 
     } 
    else 
     { 
      printf("In Parent Process\n"); 
      printf("Child PID : %d\n",getpid()); 
      printf("Parent PID : %d\n",getppid()); 
     } 
} 

它輸出:

 
In Parent Process 
Child PID : 2061 
Parent PID : 1830 
In Child Process 
Child process PID : 2062 
Parent Process PID : 1161 

但如果我寫了等待中的其他塊()函數,即:

#include<stdio.h> 
#include<unistd.h> 
#include<sys/types.h> 
int main() 
{ 
    pid_t pid; 
    pid=fork(); 
    if(pid==0) 
     { 
      printf("In Child Process\n"); 
      printf("Child process PID : %d\n",getpid()); 
      printf("Parent Process PID : %d\n",getppid()); 
     } 
    else 
     { 
      wait(); 
      printf("In Parent Process\n"); 
      printf("Child PID : %d\n",getpid()); 
      printf("Parent PID : %d\n",getppid()); 
     } 
} 

它輸出 -

 
In Child Process 
Child process PID : 2044 
Parent Process PID : 2043 
In Parent Process 
Child PID : 2043 
Parent PID : 1830 

我沒有得到爲什麼PID值retur第一個代碼中的子進程ned與父進程pid不同。 而在第二個代碼中,它是相同的。有人可以解釋上述問題的原因嗎?

+0

你看過嗎,哪個過程實際上是1830?從我所記得的情況來看,如果父進程運行完畢,並且孤兒子進程仍然存在,則它可能是1830年的進程「init」。 – icbytes

+2

@icbytes init進程始終是進​​程1.更有可能pid 1830是shell的pid。 –

+0

然後它不是「init」,thx。 – icbytes

回答

3

記住getpid返回當前進程的PID,以及getppid返回當前進程的父進程的PID。

所以在第二個例子中,當你在父進程調用getpid你得到的,如果本身(父進程)和getppid得到盛大 -parent的PID的PID。

孩子PID是fork返回的值。


更關係到你的問題是,你有當特定工藝在現代多任務系統,這意味着孩子與父進程可能需要把打印出的文本運行無法控制。在你的情況下,似乎第一個例子中的子進程在父進程打印其行之前不會運行。

wait函數的作用是實際等待一個子進程退出,並且父進程將會阻塞,直到子進程退出。

+0

你能澄清這個答案嗎?我不理解它如何解決OP的問題。 OP不抱怨不同的打印命令。報告的問題是,在第一種情況下,從孩子打印的「getppid」值(1161)與父母打印的getpid值不同(2061)。 – kaylum

+0

由於實際上是父級的pid,所以OP通過在父級中打印「getpid」結果的「child pid」使其變得混亂。 – kaylum

0

勒夫的回答是優秀的。

#include<stdio.h> 
#include<unistd.h> 
#include<sys/types.h> 
int main() 
{ 
    pid_t pid; 
    pid=fork(); 
    if(pid==0) 
     { 
      printf("In Child Process\n"); 
      printf("Child process PID : %d\n",getpid()); 
      printf("Parent Process PID : %d\n",getppid()); 
     } 
    else 
     { 
      wait(); 
      printf("In Parent Process\n"); 
      printf("Child PID : %d\n", pid); // fork returns the pid of the child 
      printf("Parent PID : %d\n", getpid()); // because I'm the parent 
     } 
} 
0

第一個例子:作爲附加的註釋,您可以通過打印的fork結果得到的子進程在else分支的pid fork函數返回兩個過程,在叉後你的第一個例子中,父母開始執行並打印其PID 2061和PID母公司1830(慶典)和母公司將終止,而無需等待孩子來完成,所以,當孩子開始執行它,將打印PID 2062及其母公司已經終止正在打印一些其他的PID。

請您打印父PID時,子進程在運行前及在其他終端使用命令ps -l看哪個的PID孩子正在打印作爲父母睡PID()。

第二個例子:

您正在使用父進程的等待是家長會等待,直到孩子因此終止子進程正在打印正確parentpid因爲父母仍然沒有結束。