為什麼沒有進入迴圈?(乙個pipe例子)

2021-06-14 03:39:22 字數 1360 閱讀 6663

一、有錯誤的程式**:

#include #include #include #include void writer(const char * message, int count, file * stream)

}void reader(file * stream)

; printf("enter reader\n");

while ( 0 != feof(stream) && 0 != ferror(stream) && buf == fgets(buf, sizeof(buf), stream) )

}int main(int argc, char ** argv)

pid = fork();

if ( 0 == pid )

else

return 0;

}

這段程式**執行結果如下:

$ gcc pipe.c 

$ ./a.out

子程序 19299

enter reader

父程序 19298

enter writer, count 5

執行結果顯然與期望不符,使用gdb除錯,發現程式受到了sigpipe訊號,然後退出了。

而sigpipe是在「reader中止之後寫pipe的時候傳送」產生的。sigpipe的預設處理時程式退出,好像也沒有任何提示。

最後發現是因為reader中迴圈條件錯了,導致子程序立即退出了,也就關閉了reader端(因為父程序立即關閉了reader端,子程序再關閉一次,reader就沒有了)。

二、修正**

將reader方法中的迴圈條件修改為:

while ( 0 == feof(stream) && 0 == ferror(stream) && buf == fgets(buf, sizeof(buf), stream) )
問題解決,執行結果為:

$ gcc pipe.c 

$ ./a.out

子程序 19329

enter reader

父程序 19328

enter writer, count 5

hello

hello

hello

hello

hello

結果符合期望。

三、feof和ferror的返回值意義

當檔案讀取到末尾時,feof返回非0值,否則返回0.

當檔案讀寫過程中出錯時,ferror返回非0值,否則返回0.

乙個沒有 的for迴圈

如果for迴圈沒有 那麼該for迴圈預設對第一條語句進行迴圈,以 結尾就結束了。這個語法同樣適用於if while迴圈。例如下面這個例子 public class fordemo int s 0 for int i 0 i myintarray.length i if i 2 1 s myintar...

每個表的extent為什麼沒有乙個固定數量

每個表都會有在tblspaces tblspaces段中有乙個頁來描述該秒的資訊,該頁也稱為該錶的partition page。在該partition page中通常有5個slot,其中 第4個slot用來描述表上索引的資訊 第5個slot用來記錄表上每個extent的長度和起始頁面的偏移位置 因為...

為什麼乙個例項只有乙個LGWR

昨天有人問為什麼只有乙個lgwr程序呢?在單例項中,確實只有乙個lgwr程序,在rac中,每個例項都有乙個lgwr程序。lgwr負責將redo log buffer中的資料寫入redo log file.即使你給日誌group 分配了多個member,也只有乙個lgwr去寫入。注意,多個日誌成員他們...