一、有錯誤的程式**:
#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去寫入。注意,多個日誌成員他們...