我正在尝试编写一个C代码(在Ubuntu Linux操作系统上运行),它从stdin连续读取,并且每次都接收不同长度的字节。每当接收缓冲区达到或超过15时,它需要以15字节长的数组发送回stdout。
草案代码
$_POST['id']
举例说明一个场景。我们每次接收30个字节,分3批,10个字节。我在下面的示例场景中使用了3个echo命令来表示这一点。
还添加预期输出和当前草稿代码的实际输出。任何评论或建议有预期的输出(可能是另一个函数而不是read和printf?),将不胜感激。
方案
1号航站楼:
#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;
}
2号航站楼:
mkfifo /tmp/MyPipe
tail -f /tmp/MyPipe | ./StreamProcess
1号航站楼的预期输出
第一次回声后:没有打印
第二次回声后:
echo -ne '1234567890' >> /tmp/MyPipe
echo -ne 'abcdefghij' >> /tmp/MyPipe
echo -ne 'qwertyuiop' >> /tmp/MyPipe
第三次回声后:
Part 1:1234567890abcde
终端1上的当前输出(带草稿代码)
第一次回声后:没有打印
第二次回声后:
Part 1:1234567890abcdePart 2:fghijqwertyuiop
第三次回声后:(仅打印$提示)
Part 1:1234567890s· s·Part 2:abcdefghijs· s·
答案 0 :(得分:1)
根据问题中列出的标准,以下代码将执行所需的操作。
编辑:将评论纳入提问。
编辑:添加错误检查
#include <stdio.h> // printf(), STDIN_FILENO. perror()
#include <unistd.h> // read(), exit(), EXIT_FAILURE
#define MAX_READ_LEN 15
int main( void)
{
char buff[ MAX_READ_LEN+1 ];
int partNum = 0;
while( 1 )
{
// Round 1
ssize_t bytesRead = read( STDIN_FILENO, buff, MAX_READ_LEN );
if( 0 > bytesRead )
{
perror( "read failed" );
exit( EXIT_FAILURE );
}
// implied else, read successful
buff[ bytesRead ] = '\0';
partNum++;
printf("Part %d:%s\n", partNum, buff);
}
return 0;
} // end function: main