【问题标题】:read() not waiting for inputread() 不等待输入
【发布时间】:2012-08-21 00:17:07
【问题描述】:


我遇到了一个奇怪的问题。我正在开发一个简单的程序,该程序应该通过网络将从标准输入获取的数据发送到该程序的另一个实例,该实例应该将数据直接发送到标准输出。但它没有按预期工作,只发送了一部分数据。之后,我设法从标准输入中找出问题出在哪里:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define SIZE 1024

int main(void) {
    char *buffer;
    int read_bytes;

    buffer = (char *) malloc(sizeof(char)*SIZE);

    while ((read_bytes = read(STDIN_FILENO,buffer,SIZE)) == SIZE) {
        write(STDOUT_FILENO,buffer,SIZE);
        fprintf(stderr,"read %d bytes\n",read_bytes);
    }
    fprintf(stderr,"read %d bytes\n",read_bytes);
    write(STDOUT_FILENO,buffer,read_bytes);
    return 0;
}

(这只是为了简单地演示问题,而不是原始代码的实际部分)
一切正常(-> 将数据从标准输入重新发送到标准输出),直到我从需要更多时间的东西中获取信息,因为示例:

find / | ./the_programme > output.file

输出在几千字节后停止,我真的很困惑为什么(肯定没有完成)。我尝试使用 fcntl 清除 STDIN_FILENO 上的 O_NONBLOCK 标志,但它根本没有帮助。我可能在这里遗漏了一些非常基本的东西,但是手册页和谷歌搜索都没有帮助我。

【问题讨论】:

  • 做到了。我应该以不同的方式问:有没有办法让 read() 等到请求的字节可用(或找到 EOF)?我有点累了,希望能证明我困惑的问题......

标签: c linux input io stdin


【解决方案1】:

来自手册(man 2 read):

返回值:

成功时,返回读取的字节数(零 表示文件结束),文件位置由此前进 数字。如果此数字小于该数字,则不是错误 请求的字节数;这可能会发生,例如因为更少的字节 现在实际上可以使用(可能是因为我们接近 文件结束,或者因为我们正在从管道读取,或者从 终端),或者因为 read() 被信号中断了。

while ((read_bytes = read(STDIN_FILENO,buffer,SIZE)) > 0) {
    write(STDOUT_FILENO,buffer,read_bytes);
    fprintf(stderr,"read %d bytes\n",read_bytes);
}

【讨论】:

  • 谢谢。我知道当 read() 返回的数字小于请求的数字时它不是错误,但我认为使用 fcntl() 并清除 O_NONBLOCK 应该使 read() 等待输入(直到请求的字节可用)。这可能吗?我应该这样提出问题。很抱歉造成误会。
  • 默认情况下 O_NONBLOCK 未启用,因此您不必清除它。不,这是不可能的。
猜你喜欢
  • 2011-12-05
  • 2023-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多