我试着写一个c代码(运行在ubuntu linux操作系统上),它连续地从stdin读取数据,每次接收不同长度的字节。每次接收缓冲区达到或超过15时,它需要以15字节长的数组发送回stdout。
准则草案
#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·
在第三个echo之后:(只打印$prompt)
Part 1:1234567890s· s·Part 2:abcdefghijs· s·$
最佳答案
给定问题中列出的条件,下面的代码将执行所需的操作。
编辑:包含对问题的评论。
编辑:添加错误检查
#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