在C中读取和删除FIFO

时间:2013-04-21 02:25:54

标签: c named-pipes fifo

我正在构建一个通过FIFO与其客户端进行通信的服务器。

到目前为止,我已设法创建一个FIFO,运行一个新线程,一旦消息到达FIFO并从线程输出消息。

问题是,只要客户端在管道中写入内容,服务器就会无限地打印消息(我正在while(1)中的管道中读取。)

我的问题是:read操作是否也应该从管道中删除消息,因此不会再次读取?这不是First In,First Out 的重点吗?这是我必须手动完成的吗?

这也是我的代码,如果有帮助:http://pastebin.com/Ag7vgrav
我在FIFO中写的只是:echo test > /home/ubuntu/work/my_fifo

1 个答案:

答案 0 :(得分:5)

您需要检查read(2)的返回代码。如果返回-1,则发生错误,您应立即停止读取。如果它返回0,那就是EOF,这意味着编写器关闭了它的FIFO结束,你也应该停止写入并关闭FIFO的结束。

为了支持多个客户端,每次接受新客户端时都需要重新打开FIFO。

您管理子线程的方式也有一些未定义的行为。无法保证线程将在whilemain()循环的当前迭代结束之前启动,此时thread_arg实例超出范围。为了确保线程在仍然有效时仍然可以访问该数据,您需要使其成为全局数据(如果您只有一个子线程),或者在堆上动态分配它。通常的模式是:

// Parent thread:
thread_arg *arg = malloc(sizeof(*arg));
...
pthread_create(..., &thread_proc, arg);

void *thread_proc(void *t_arg)
{
    thread_arg *arg = t_arg;

    // Thread code goes here
    ...
    free(arg);
    return exit_status;
}