簡體   English   中英

簡單的fork程序中無法預測的輸出

[英]Unpredictable output in simple fork program

請原諒我一個如此愚蠢的問題的社區-我已經花了5個多小時試圖找出原因,但我失敗了。

以下是代碼,這是我們考試中的一個問題-我們被問到是否可以預測此代碼的輸出,並且確定嗎?

在多台機器上運行此代碼后,我發現到處輸出的都是-“ child parent”。

我對以下代碼的理解是,一旦流程分叉,將創建流程的副本,該副本只能執行僅在fork()調用下編寫的語句。 現在完成fork()后,將有兩個進程-子進程和父進程。 (我們學校曾指示我們在使用管道時首先終止父進程,然后終止子進程,但是在搜索互聯網時,我只能看到無法確定哪個先運行。

我認為這應該發生-

方案1-兒童先執行

我認為,當child首先執行時,它將首先打印“ child”,然后寫入文件描述符,然后由於_exit(0)終止子進程,然后父進程繼續進行,讀取並打印Parent。 這就是正在發生的事情。 我不知道這是否真的在發生。

方案2:先執行父項,

現在,它嘗試首先讀取空管道。 父級將嘗試讀取數據,被阻止,然后子級將首先打印子級,然后寫入管道,這將啟用讀取命令,因此父級將在其后打印。

有人可以確認我的理解是否正確,並指出我的理解中的錯誤。

#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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM