[英]How does this C program work?
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] ==>中,然后創建了一個新進程
如果s = 0 ==>程序輸入10個整數==>如果整數是奇數==>,它將啟動子函數。它將sizex(int)所指向的緩沖區中的&x字節寫入與打開的文件關聯的文件中描述符fd [1] ==>它將fd [1]指示的文件描述符釋放
如果s!= 0 ==>如果&v = 0 ==>,它將啟動父函數,並顯示&v的值。
但是我仍然不確定該程序如何工作,請隨時進行更正或提供更多詳細信息。 感謝您的幫助!
你近了
您對子進程如何工作的描述是正確的。
父進程從管道讀取每個數字。 它不是在測試z
是否為0,而是在測試read
是否返回0,這在達到EOF(即孩子已關閉管道)時會執行。 而且它不顯示的值&z
,它加起來的所有值z
,當它到達終點顯示總。
在編寫時,該代碼有點奇怪,因為讀取和寫入功能的第二個和第三個參數看起來是向后的。 “從sizeof(int)所指向的緩沖區寫入&y字節”很奇怪,因為sizeof()都不是緩沖區。
如果交換這兩個,則子進程將從控制台讀取整數,並將奇數寫入到返回父級的管道中,后者將讀取它們,求和並在EOF上打印總和。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.