我使用的是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;
}
答案 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运行一样,那么你只读取一个字符,输出“ - ”,然后读取并等待,直到孩子写入更多缓冲区。只有一个是因为你的孩子在写了一个字符后被安排了。