2013-10-09 49 views
0

我想獲得子進程的PID。 但是當我運行execl時,它打印出0的PID,有時是負數而不是真正的PID。 但是,如果我刪除execl行,它工作正常。 任何人都知道爲什麼?Execl和打印的兒童PID

if (pid==0) 
      { 
        arrayPID[i] = getpid(); 
       execl("/bin/ls","/bin/ls",NULL); 
      } 

      printf ("Child PID is %i\n",arrayPID[i]); 

注意,我知道,EXECL的第二個參數應該只是「LS」,但它似乎是工作,我需要它是這樣的。是因爲這個嗎?

我也試過這個,但仍給零PID或負值的PID。

if (pid==0) 
      { 
        arrayPID[i] = getpid(); 
      } 
if (pid==0) 
      { 
       execl("/bin/ls","/bin/ls",NULL); 
      } 

假設我的其他代碼是正確的。

感謝

回答

2

fork()返回子進程的PID給父進程。在子女中撥打getpid不會執行任何操作。

我想你要找的是:

pid_t pid = fork(); 
if (pid == 0) 
{ 
    // child 
    execl("/bin/ls", "ls", NULL); 
} 
else if (pid > 0) 
{ 
    // parent 
    printf("Child PID is %d\n", (int)pid); 
} 
else 
{ 
    // error 
    perror("fork failed"); 
} 
+0

它給了我的子進程的PID? – Newbie

+0

fork只返回零值,所以我們知道它是一個孩子。我需要實際的PID – Newbie

+1

@Newbie,'fork()'在孩子中返回零。在父親中,它返回孩子的PID。 –

3

我有一個偷渡懷疑,什麼可能發生的。這延伸了Carl的答案。

假設你的代碼沒有這樣的事情......(我不能100%肯定沒有更多的細節)

int pid = fork(); 
if (pid == 0) { 
    arrayPID[i] = getpid(); 
    execl("/bin/ls","/bin/ls",NULL); 
} 
printf ("Child PID is %i\n",arrayPID[i]); 

的問題是,你只輸入if聲明子進程,但而不是父進程。子進程將調用execl,除非出現問題,否則永遠不會到達printf(儘管如此,它將打印出您想要的內容)。

因此,在過程中,如果沒有這部分代碼前初始化arrayPID[i],它仍然是未初始化當它到達printf,因而主要打印出來的垃圾(雖然我認爲0是最常見並不罕見)。

+0

+1合理的猜測。 – Duck