[英]Unpredictable output in simple fork program
請原諒我一個如此愚蠢的問題的社區-我已經花了5個多小時試圖找出原因,但我失敗了。
以下是代碼,這是我們考試中的一個問題-我們被問到是否可以預測此代碼的輸出,並且確定嗎?
在多台機器上運行此代碼后,我發現到處輸出的都是-“ child parent”。
我對以下代碼的理解是,一旦流程分叉,將創建流程的副本,該副本只能執行僅在fork()調用下編寫的語句。 現在完成fork()后,將有兩個進程-子進程和父進程。 (我們學校曾指示我們在使用管道時首先終止父進程,然后終止子進程,但是在搜索互聯網時,我只能看到無法確定哪個先運行。
我認為這應該發生-
我認為,當child首先執行時,它將首先打印“ child”,然后寫入文件描述符,然后由於_exit(0)終止子進程,然后父進程繼續進行,讀取並打印Parent。 這就是正在發生的事情。 我不知道這是否真的在發生。
現在,它嘗試首先讀取空管道。 父級將嘗試讀取數據,被阻止,然后子級將首先打印子級,然后寫入管道,這將啟用讀取命令,因此父級將在其后打印。
有人可以確認我的理解是否正確,並指出我的理解中的錯誤。
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>
int BUFSIZE = 4096;
int main (int argc, char* argv[])
{ int fd[2];
pid_t pid;
char buffer[BUFSIZE];
pipe(fd);
if ((pid = fork()) == 0)
{ printf("child\n");
write(fd[1], "a", 1);
_exit(0);
}
read(fd[0], buffer, BUFSIZE);
printf("parent\n");
}
在您的程序中,您有一個管道。 父從管道的一個磁頭讀取,因此,他等待 ,直到有人在管道的另一頭寫。 孩子會寫,所以即使父母先執行,他也會等待孩子寫。 更改此:
read(fd[0], buffer, BUFSIZE);
printf("parent\n");
至
printf("parent\n");
read(fd[0], buffer, BUFSIZE);
並重新運行它。 現在它將在嘗試閱讀之前打印。 即使這樣,時不時地,孩子還是第一個打印的孩子,有時是父母的孩子。 這完全取決於誰先獲得處理器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.