2016-11-23 77 views
-1

我正在使用linux \ unix操作系統。當我跑下面的代碼時,我得到2個輸出。下面提到:獲取2個輸出爲相同的代碼

一)12345- B)1-2-3-4-5-

任何人都可以讓我知道爲什麼和怎樣上述2個輸出來了?

int main() 
{ 
int i, n, pfds[2]; 
char c, buf[80]; 

pipe(pfds); 
if (fork() == 0) 
{ 
    for (c='1'; c<='5'; c++) 
    write(pfds[1], &c, 1); 
} 
else 
{ 
    close(pfds[1]); 
    while ((n = read(pfds[0], buf, sizeof(buf))) > 0) 
    { 
    write(1, buf, n); 
    write(1, "-", 1); 
    } 
} 
return 0; 
} 

回答

0

Linux將您的寫入管道緩衝區中,並在某個時刻沖刷緩衝區,並且讀取叉一次性讀取所有內容。在寫入之後,您應該可以通過執行fflush()來更改它。

+0

fflush只會影響他不使用的stdio緩衝區(fwrite和其他)。 – 12431234123412341234123

0

爲什麼使用字符數組只打印單個字符?不要使用stdio緩衝區來打印字符。

我修改了你的聲明形式char buf [80]到buf。

while ((n = read(pfds[0], &buf, 1)) > 0) 
{ 
write(1, &buf, n); 
write(1, "-", 1); 
} 
0

管道是一個流。這意味着你將從另一端接收從另一端發送的所有字符並按照相同的順序。但不保留數據包。比賽條件允許一個讀得到的一切或在同一時間只有一個字符,或者兩者之間的一切都很...

如果你想在一個時間上的字符處理(並獲得1-2-3-4-5-

while ((n = read(pfds[0], buf, 1)) > 0) 
{ 
write(1, buf, n); 
write(1, "-", 1); 
} 

如果你prefere處理整體上的一切(並獲得12345-):

int tot = 0 
while ((n = read(pfds[0], buf+tot, sizeof(buf)-tot)) > 0) tot += n; /* gather everything */ 
write(1, buf, tot); 
write(1, "-", 1); 
0

當你調用read(),該函數將看了這麼多字符可用,直到有沒有更多的左或命中數。

當您使用sizeof(buf)運行它時,您可能會讀取1,2..5個字符,如果在管道中存在5個字符,就像在運行中一樣,您將讀取所有字符,輸出「 - 」而下一次讀取返回0,因爲管道是空的,沒有人再寫入。

如果管道中只有一個字符,就像在你的b運行中一樣,那麼你只讀取一個字符,輸出「 - 」,然後讀取並等待,直到子進一步寫入緩衝區。只有一個是因爲你的孩子是在編寫一個字符之後安排的。

相關問題