Linux

為什麼“子”程序在其父程序之前完成?

  • October 5, 2015

這是給出的程式碼範例:

# include <stdio.h>
# include <unistd.h>
void main() {
   static char *mesg[] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
   int display(char *), i;
for (i=0; i<10; ++i)
   display(mesg[i]);
sleep(2);
}

int display(char *m) {
char err_msg[25];
switch (fork()) {
   case 0:
       execlp("/bin/echo", "echo", m, (char *) NULL);
       sprintf (err_msg, "%s Exec failure", m);
       perror(err_msg); return(1);
   case -1:
       perror ("Fork failure"); return(2);
   default:
       return(0);
}
}

現在,我在執行這個程序之前的假設是父母會在他們的孩子之前完成。所以我的預期輸出是

0
1
2
3
4
5
6
7
8
9

但是,每次我執行程序時,我都會得到一個隨機的程序順序。我的問題是“為什麼?”。是因為處理器會在程序之間跳轉的“上下文切換”嗎?某些程序比其他程序獲得更多的“資源分配”嗎?父子程序的順序不是一成不變的,這就是我們有殭屍和孤兒程序的原因嗎?

一旦你 fork() 子程序就開始執行,實際上它們甚至沒有“啟動”,它們只是在 fork() 呼叫之後繼續在程式碼中,就像父程序一樣。只有 fork() 的返回值不同。父母和孩子可以按任意順序退出。所以是的,上下文切換將使所有程序隨機執行。

當子程序退出並且父程序沒有正確“獲取”子程序退出程式碼時,您將獲得殭屍程序。殭屍程序基本上只包含尚未檢索的退出程式碼,每次看到一個,都責怪父程序不小心。(殭屍是父級中的一個錯誤,除非父級是短暫的並且不需要照顧。)如果父級在子級之前退出,則子程序將重新設置為 PID 1,這將執行退出程式碼收穫。(它還將清除程序中的任何殭屍。)

引用自:https://unix.stackexchange.com/questions/234092