2015-09-25 98 views
-2

我對fork()系統調用有這些愚蠢的懷疑, 如果有人請回答這些問題,我將不勝感激。linux中的fork()系統調用

  • 是否叉()系統調用返回一個整數?如果是,那麼爲什麼當
    執行fork()系統調用時,我們將其值設爲pid_t
    我們不能只寫int x = fork();

對於EG-

#include<stdio.h> 
#include<sys/types.h> 
#include<unistd.h> 
int main() 
{ 
pid_t pid; 
pid=fork(); 
if(pid==0) 
{ 
    printf("Child Process"); 
} 
else if(pid>0) 
{ 
    printf("Parent Process"); 
} 
else 
{ 
    printf("Unable to create"); 
} 
} 
  • 爲什麼我們正在執行PID =叉(),而INT X =叉()?
  • 上面的程序給出了一個輸出 - Parent ProcessChild Process爲什麼它 首先執行父進程而不是子進程?

我曾嘗試這個代碼 -

#include<stdio.h> 
    int main() 
    { 
     int x; 
     x=fork(); 
     if(x==0) 
     { 
      printf("Child Process"); 
     } 
     else if(x>0) 
     { 
      printf("Parent Process"); 
     } 
     else 
     { 
      printf("Unable to create"); 
     } 
    } 
  • 我試圖收集叉的()中的整數變量 在Ubuntu 15.04的gcc編譯的值和其工作正常,未示出 任何錯誤,並給出與上述程序 給予相同的結果。
  • 它是編譯器問題還是這個代碼罰款? 即使我沒有給頭文件sys/types.h和unistd.h,仍然不是 顯示任何錯誤。

有人可以 請回答我的問題嗎?

+0

你讀了幾遍* fork [2]的文檔(http://man7.org/linux/man-pages/man2/fork.2.html)?你讀過一本好的Linux或POSIX編程書嗎?請參閱參考資料[here](http://stackoverflow.com/a/11681845/841108) –

+0

您應該使用[fflush(3)](http://man7.org/linux/man-pages/man3/fflush.3 .html),因爲I/O被緩衝,你應該用'gcc -Wall -Wextra -g'編譯 –

+0

@ BasileStarynkevitch-如果我先輸入錯誤的代碼,然後輸入錯誤的代碼,是否需要緩衝?嘗試了錯誤的代碼。 –

回答

3

使用pid_t意味着源代碼對於例如使用64位PID的系統。

進程按該順序執行,因爲調度程序決定如何執行它們。

1

這裏的pid_t是64位的unsigned int,你可以在頭文件中找到它。這基本上用於使程序便攜。

爲什麼父母過程第一?

Ans: 1。分叉進程後,子進程必須複製父進程的內存佈局(複製頭,堆棧,初始化數據,未初始化數據),這樣父進程無關,所以在大多數情況下,父進程必須先執行。

  1. 但是在少數情況下,當孩子首先執行時,僅當父母排班時間到期時。

  2. 在UNIX系統/ proc/sys/kernel/sched_runs_first中,使此值爲1以確保子進程先運行。

總之,這種行爲沒有被定義和undetminstic,最好使用任何同步方法。