在准备期末考试时,我发现了一个非常有趣的任务。这就是我想要编写的代码。
程序将标准输入读入缓冲区(固定大小)。当缓冲区已满时,程序将其打印到文件中。但是,如果缓冲区未在固定时间(超时)内填充,程序将打印到文件 [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 和谷歌都没有给我答案(或者我只是不知道要搜索什么)
提前致谢
最佳答案
这里有一些提示:
- 使用带超时的
select()
- 使用
fcntl
将 FD 设置为O_NONBLOCK
- 仅当
FD_ISSET
返回 true 时才从 FD 读取 - 阅读直到得到
EWOULDBLOCK
或EAGAIN
(表示超时)。如果您看到EINTR
,请重复循环。
这里有一个更好的答案:去你的图书馆借一本斯蒂芬斯。我相信是这本书: http://www.amazon.com/Programming-Environment-Addison-Wesley-Professional-Computing/dp/0321637739 你想要(他的都很棒)。但是,这仍然是教您如何做这些事情的规范引用书,应该是您类(class)的核心教材。
关于C/UNIX 从输入读取(受字符计数和超时限制),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21215023/