2014-02-13 83 views
-1
void child(int *fd) { 
    int j , x; 
    for(j = 0; j < 10; j ++) { 
     scanf ("%d", &x); 
     if(x % 2 != 0) 
      write(fd[1], sizeof(int), &x); 
    } 
    close (fd[1]); 
} 

void parent(int *fd) { 
    int v, r = 0; 
    while(read(fd[0], sizeof(int), &v) != 0) 
     r = r + v; 
    printf("%d\n", r); 
} 

int main(void) { 
    int s, fd[2]; 
    pipe(fd); 
    s = fork(); 
    if(s == 0) 
     child(fd); 
    else parent(fd); 
} 

我想的是,上述程序創建管道fd和放置兩個文件描述符,每一個入參數FD [0]和FD [1] ==>然後,它創建一個新進程這個C程序是如何工作的?

  • 如果s = 0 ==>程序輸入10個整數==>如果整數是奇數==>它會啓動子函數==>它將sizeof(int)指向的緩衝區寫入& x字節到與打開文件描述符,fd [1] ==>它釋放由fd [1]指示的文件描述符

  • 它啓動父函數如果s!= 0 ==>如果& V = 0 ==>它顯示& v的值。

但我還是不知道如何計劃的運作方式,請隨時糾正或給予更多細節。感謝您的幫助!

+1

請注意,您應該檢查* scanf *的返回值。現在,如果它讀取非數字,它將返回0,並保留* y *不變(因此可能在此代碼中未初始化),並將非數字保留爲未讀(所以它將保持返回0而不讀取任何內容)。 – hyde

+5

你不能刪除那樣的內容。人們已經回答了。摧毀你的問題使他們的答案無效。如果你不想在線,你不應該問這個問題。通過在這裏發佈,你已經永久地將內容授權給網站。請保留原地。 – Stijn

+0

@ user3305709如果您希望看到此內容被刪除的原因很充分,請使用「其他」選項標記主持人注意力。然後清楚地解釋爲什麼這需要被刪除。雖然也許你只需要解除關聯。如果因爲這種情況而被暫停,那麼像這樣刪除它最終只會傷害你。 – Bart

回答

2

你很近。

您對子進程如何工作的描述是正確的。

父進程從管道讀取每個編號。它不在測試z是否爲0,它正在測試read是否返回0,當它到達EOF時(即,孩子已關閉管道),它會執行此操作。它不顯示&z的值,它將z的所有值相加,並在到達結尾時顯示總值。

1

正如所寫,代碼有點奇怪,因爲讀寫函數的第二個和第三個參數看起來倒退了。 「從sizeof(int)指向的緩衝區中寫入& y字節是奇怪的,因爲sizeof()不是緩衝區。

如果交換這兩個,那麼子進程會從控制檯讀取整數,然後將奇數部分寫回管道,返回給父母,讀取它們並將它們相加並在EOF處打印總和。