获得相同代码的2个输出

时间:2016-11-23 07:44:50

标签: c linux unix pipe fork

我使用的是linux \ unix操作系统。当我在代码下面运行时,我得到2个输出。提到如下:

a)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;
} 

4 个答案:

答案 0 :(得分:0)

Linux将您的写入缓冲到管道中,并且在某些时候它会刷新缓冲区并且读取fork一次性读取所有内容。您应该可以通过在写入后执行fflush()来更改此项。

答案 1 :(得分:0)

为什么使用字符数组只打印单个字符?不要使用stdio缓冲区来打印字符。

我已将你的申报表格char buf [80]修改为buf。

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

答案 2 :(得分:0)

管道是一条流。这意味着你将在另一端获得从另一端以相同顺序发送的所有字符。但数据包不会被保留。竞争条件允许一次读取一次只能获得一个或只有一个字符,或者介于两者之间...

如果您想一次处理char(并获得1-2-3-4-5-

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

如果您喜欢整体处理所有内容(并获得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);

答案 3 :(得分:0)

当你调用read()时,该函数将读取如此多的字符,直到没有剩余或命中计数为止。

当你使用sizeof(buf)运行它时,你可以阅读1,2..5个字符,如果管道中已经有5个字符,就像在你的运行中一样,你读取所有字符,输出一个“ - ”和下一个读取返回0,因为管道是空的,没有人再写入它。

如果管道中只有1个字符,就像你的b运行一样,那么你只读取一个字符,输出“ - ”,然后读取并等待,直到孩子写入更多缓冲区。只有一个是因为你的孩子在写了一个字符后被安排了。