read()用于从stdin读取流

时间:2017-09-24 15:49:31

标签: c linux stream stdout stdin

我正在尝试编写一个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·

1 个答案:

答案 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