第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

“fork()”之后的printf異常

“fork()”之后的printf異常

12345678_0001 2019-06-01 16:23:58
“fork()”之后的printf異常操作系統(tǒng):Linux,語言:純C我正在學(xué)習(xí)一般的C編程,以及UNIX下的特殊情況下的C編程。我發(fā)現(xiàn)了一種奇怪的行為printf()函數(shù)在使用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!為什么第二個(gè)“Hello”字符串出現(xiàn)在子程序的輸出中?是的,這正是父母在開始時(shí)打印的,父母的pid.但!如果我們把\n字符在每個(gè)字符串的末尾,我們得到預(yù)期的輸出:#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!為什么會(huì)發(fā)生這種事?它是正確的行為,還是一個(gè)錯(cuò)誤?
查看完整描述

3 回答

?
繁星淼淼

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超11個(gè)贊

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

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

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

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


查看完整回答
反對(duì) 回復(fù) 2019-06-01
?
慕娘9325324

TA貢獻(xiàn)1783條經(jīng)驗(yàn) 獲得超4個(gè)贊

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

通常,孩子只被用來調(diào)用exec*功能。因?yàn)檫@取代了完整的子進(jìn)程映像(包括任何緩沖區(qū)),所以在技術(shù)上沒有必要fflush如果這真的是你要在孩子身上做的所有事情。但是,如果可能有緩沖的數(shù)據(jù),那么在處理EXEC失敗時(shí)應(yīng)該小心。特別是,避免使用任何stdio函數(shù)將錯(cuò)誤打印到stdout或stderr(write),然后打電話給_exit(或_Exit)而不是打電話exit或者只是返回(這將刷新任何緩沖輸出)?;蛘哂貌孀忧皼_一下來避免這個(gè)問題。


查看完整回答
反對(duì) 回復(fù) 2019-06-01
  • 3 回答
  • 0 關(guān)注
  • 827 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)