【发布时间】:2018-03-05 15:20:25
【问题描述】:
我正在尝试编写一个 C 代码(在 Ubuntu Linux 操作系统上运行),它连续从标准输入读取,并且每次接收不同长度的字节。每次接收缓冲区达到或超过 15 时,它都需要以 15 字节长的数组发送回标准输出。
规范草案
#include <stdio.h>
#include <unistd.h>
int main()
{
char buff[100];
// Round 1
read(STDIN_FILENO, buff, 15);
printf("Part 1:%s", buff);
// Round 2
read(STDIN_FILENO, buff, 15);
printf("Part 2:%s", buff);
return 0;
}
举一个场景的例子。我们收到 30 个字节,分 3 批,每次 10 个字节。在下面的示例场景中,我使用了 3 个 echo 命令来表示这一点。
还添加了当前草稿代码的预期输出和实际输出。任何具有预期输出的评论或建议(可能是另一个函数而不是 read 和 printf ?),我们将不胜感激。
场景
1号航站楼:
mkfifo /tmp/MyPipe
tail -f /tmp/MyPipe | ./StreamProcess
2号航站楼:
echo -ne '1234567890' >> /tmp/MyPipe
echo -ne 'abcdefghij' >> /tmp/MyPipe
echo -ne 'qwertyuiop' >> /tmp/MyPipe
1 号航站楼的预期输出
第一次回显后:没有打印任何内容
第二次回声后:
Part 1:1234567890abcde
第三次回声后:
Part 1:1234567890abcdePart 2:fghijqwertyuiop
1 号航站楼的当前输出(带有草稿代码)
第一次回显后:没有打印任何内容
第二次回声后:
Part 1:1234567890s· s·Part 2:abcdefghijs· s·
第三次回显后:(仅打印 $ 提示符)
Part 1:1234567890s· s·Part 2:abcdefghijs· s·$
【问题讨论】:
-
这是特定于操作系统的(您可能使用 POSIX 或 Linux)。阅读poll(2) 并编辑您的问题以改进它(至少通过说明您正在编码的操作系统)
-
1)
char buff[100];buff 未初始化 2)read(STDIN_FILENO, buff, 15);读取返回一个值。用它! 3)printf("Part 1:%s", buff);buff 不一定是 nul 终止的。另外:在格式字符串中添加一个 '\n'。 ` -
@wildplasser 除非在全局范围内,否则缓冲区是否未预初始化?我的理解是需要放置空终止符,但缓冲区不需要归零。
-
问题说读/写操作是连续的,但代码最多只能读取 30 个字节。
标签: c linux stream stdout stdin