我试着写一个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

10-08 11:08