如何在没有遇到EOF时终止read()?

时间:2011-02-08 00:22:51

标签: c interrupt eof

我正在构建一个客户端/服务器模型,但是使用带有命名管道的套接字和mkfifo()。

客户端将输出写入名称管道,我使用以下命令读取服务器中的输入:

while ((n = read(fd_in, &newChar, 1)) == 1) { /* ... */ }

我一次只读一个字符,直到遇到两个字符:<'CR'><'LF'>。我想以这样一种方式制作我的代码:如果客户端没有以<'CR'><'LF'>终止。也许过了一段时间后,我可以丢弃它并继续前往另一个客户端,否则下一个客户端将不得不等待,也许是无限期。

有没有办法终止执行read()?如果它在2秒内没有返回,我可以说中断读取并丢弃先前读取的字符,并再次开始阅读吗?

感谢您的帮助,

Jary

3 个答案:

答案 0 :(得分:4)

#include <stdbool.h>
#include <poll.h>

do {
    ssize_t ret;
    struct pollfd ps = {.fd = fd_in, .events = POLLIN}; 

    if (poll(&ps, 1, 2000) < 0)
        break; /* kick client */
    ret = read(in_fd, ...);
    if (ret != 1)
        break;
    /* process read data */
} while (true);

检查是否有要读取的数据;如果没有在2000毫秒内,做任何你想做的事情(例如断开连接)。

答案 1 :(得分:3)

尝试在O_NONBLOCK FIFO的读取端时传递open标志。这应该改变行为,以便read立即返回,即使请求的字符数不在管道中。

答案 2 :(得分:1)

要同时处理多个客户端,您应该使用fcntl()将文件描述符设置为非阻止,然后使用select()poll()进行阻止,直到输入出现在其中至少一个上