亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

“fork()”之后的printf異常

“fork()”之后的printf異常

12345678_0001 2019-06-01 16:23:58
“fork()”之后的printf異常操作系統:Linux,語言:純C我正在學習一般的C編程,以及UNIX下的特殊情況下的C編程。我發現了一種奇怪的行為printf()函數在使用fork()打電話。電碼#include <stdio.h>#include <system.h>int main(){     int pid;     printf( "Hello, my pid is %d", getpid() );     pid = fork();     if( pid == 0 )     {             printf( "\nI was forked! :D" );             sleep( 3 );     }     else     {             waitpid( pid, NULL, 0 );             printf( "\n%d was forked!", pid );     }     return 0;}輸出量Hello, my pid is 1111I was forked! :DHello, my pid is 11112222 was forked!為什么第二個“Hello”字符串出現在子程序的輸出中?是的,這正是父母在開始時打印的,父母的pid.但!如果我們把\n字符在每個字符串的末尾,我們得到預期的輸出:#include <stdio.h>#include <system.h>int main(){     int pid;     printf( "Hello, my pid is %d\n", getpid() ); // SIC!!     pid = fork();     if( pid == 0 )     {             printf( "I was forked! :D" ); // removed the '\n', no matter             sleep( 3 );     }     else     {             waitpid( pid, NULL, 0 );             printf( "\n%d was forked!", pid );     }     return 0;}輸出量:Hello, my pid is 1111I was forked! :D2222 was forked!為什么會發生這種事?它是正確的行為,還是一個錯誤?
查看完整描述

3 回答

?
繁星淼淼

TA貢獻1775條經驗 獲得超11個贊

原因是如果沒有\n在格式字符串的末尾,該值不會立即打印到屏幕上。相反,它是在進程中緩沖的。這意味著它實際上是在分叉操作之后才被打印出來的,因此您需要打印兩次。

添加\n雖然強制緩沖區被刷新并輸出到屏幕上。這種情況發生在分叉之前,因此只打印一次。

您可以通過使用fflush方法。例如

printf( "Hello, my pid is %d", getpid() );fflush(stdout);


查看完整回答
反對 回復 2019-06-01
?
慕娘9325324

TA貢獻1783條經驗 獲得超5個贊

fork()有效地創建流程的副本。如果,在打電話之前fork(),它具有緩沖的數據,父數據和子數據都將具有相同的緩沖數據。下一次,當它們中的每一個做一些事情來刷新它的緩沖區時(例如,在終端輸出的情況下打印換行符),您將看到除了該進程產生的任何新輸出之外,緩沖的輸出。因此,如果要在父級和子級中同時使用stdio,那么您應該fflush在分叉之前,要確保沒有緩沖的數據。

通常,孩子只被用來調用exec*功能。因為這取代了完整的子進程映像(包括任何緩沖區),所以在技術上沒有必要fflush如果這真的是你要在孩子身上做的所有事情。但是,如果可能有緩沖的數據,那么在處理EXEC失敗時應該小心。特別是,避免使用任何stdio函數將錯誤打印到stdout或stderr(write),然后打電話給_exit(或_Exit)而不是打電話exit或者只是返回(這將刷新任何緩沖輸出)。或者用叉子前沖一下來避免這個問題。


查看完整回答
反對 回復 2019-06-01
  • 3 回答
  • 0 關注
  • 845 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號