2016-11-23 72 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运行中一样,那么你只读取一个字符,输出“ - ”,然后读取并等待,直到子进一步写入缓冲区。只有一个是因为你的孩子是在编写一个字符之后安排的。

相关问题