2011-09-05 52 views
0

我有以下代碼:爲什麼程序有時會「跳過」printfs?

if (!strcmp(ent_child->d_name, "eeprom")){ 
    printf("\tread_from_driver: found a match! ");//DEBUG 
    get_child_path(child_path, child_path, "eeprom"); 
    printf("The path is: %s\n", child_path);//DEBUG 
    read_eeprom(child_path); 
} 

這將導致在某些時候段錯誤,(大概get_child_path),但第一個printf不會發生,即使當我修改代碼是這樣的:

if (!strcmp(ent_child->d_name, "eeprom")){ 
    while(1) 
     printf("\tread_from_driver: found a match! ");//DEBUG 
    get_child_path(child_path, child_path, "eeprom"); 
    printf("The path is: %s\n", child_path);//DEBUG 
    read_eeprom(child_path); 
} 

它確實發生。這是怎麼回事?這絕對不是我第一次觀察到這種行爲。

+5

也許嘗試刷新輸出? – quasiverse

回答

10

stdout行緩衝默認情況下,這意味着你當你發送一個換行符,或當你明確地調用fflush(stdout)只能獲得更新的輸出。

+0

實際上'stdout'是默認的行緩衝或完全緩衝,具體取決於它是否是交互式設備。如果您想確保輸出在特定時間到達,請始終使用'fflush'。 –

+0

與其向您的代碼添加多個'ffush(stdout)',不如添加一個調用'setvbuf(stdout,0,_IONBF,0)'來禁用'printf()'的緩衝。 –

3

在每個printf的末尾使用\n以確保輸出被刷新。否則,它會被緩衝,而不是立即寫入。

2

\n放在第一個printf的末尾,分段故障警告消除了最後一個輸出行。我真的不能解釋它,我只知道,如果你把它\n寫入

+2

這沒有幫助。這就像是說:「幹吧!」 – quasiverse

2

只有stderr沒有緩衝...... stdout被緩衝,因此你不一定會看到輸出,直到緩衝區已滿,遇到換行符,或者您專門刷新流。

因此,如果您要打印調試消息,請使用stderr而不是stdout

相關問題