C/UNIX 从输入读取(受字符计数和超时限制)

标签 c unix timeout buffer polling

在准备期末考试时,我发现了一个非常有趣的任务。这就是我想要编写的代码。

程序将标准输入读入缓冲区(固定大小)。当缓冲区已满时,程序将其打印到文件中。但是,如果缓冲区未在固定时间(超时)内填充,程序将打印到文件 [TIMEOUT] 和缓冲区的其余部分(当前已读取)

第一个例子:

缓冲区大小 = 5;超时 = 4;

$ 同时 : ;做 printf 1; sleep 1;完成 | ./a.out

应该写 [TIMEOUT]1111[TIMEOUT]1111[TIMEOUT]1111 等,因为 while 循环只写 4 个字符(在 4 秒限制内)。

第二个例子

缓冲区大小 = 3;超时 = 5;

$ 同时 : ;做 printf 1; sleep 1;完成 | ./a.out

应该写入 111 111 111 等,因为 while 循环写入 3 个字符(在 3 秒 < 5 秒限制内),因此永远不会发生超时。

我正在尝试使用 poll 对其进行编码,但我不知道如何找出是所有字符都已写入还是仅写入一个。我也不能卡在 read(0, buffer, buffer_size) 上,因为我会错过超时。有可能吗?我想这是我们的老师指出的,这是一个很好的练习。

当然,忙等待是 Not Acceptable ,只允许经典的 POSIX 系统调用(轮询、选择、读取、写入、打开...)。

有人可以提示我吗?我不知道如何管理这种行为,更晚的 stackoverflow 和谷歌都没有给我答案(或者我只是不知道要搜索什么)

提前致谢

最佳答案

这里有一些提示:

  1. 使用带超时的select()
  2. 使用 fcntl 将 FD 设置为 O_NONBLOCK
  3. 仅当 FD_ISSET 返回 true 时才从 FD 读取
  4. 阅读直到得到 EWOULDBLOCKEAGAIN(表示超时)。如果您看到 EINTR,请重复循环。

这里有一个更好的答案:去你的图书馆借一本斯蒂芬斯。我相信是这本书: http://www.amazon.com/Programming-Environment-Addison-Wesley-Professional-Computing/dp/0321637739 你想要(他的都很棒)。但是,这仍然是教您如何做这些事情的规范引用书,应该是您类(class)的核心教材。

关于C/UNIX 从输入读取(受字符计数和超时限制),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21215023/

相关文章:

c - scanf - 奇怪的行为 : two consecutive calls results in one different string and one correct string

c - C中 union 的内存共享

c - 在 Direct3D11 中通过 CG 使用多个纹理

websocket - SignalR - 在 Chrome/Firefox 中始终降级为服务器发送事件

java - Hadoop 总是以 java.util.concurrent.TimeoutException 结束

bash - 超时重试 Bash 命令

c - 公开函数而不是常量来描述库特性

linux - 如何解决 shell 命令错误?

unix - Solaris Make错误-ld : fatal: library -luutil: not found

linux - 如果文件为空,将文本写入第一行