在C中读取和删除FIFO

Edu*_*uca 1 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

Ada*_*eld 5

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

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

您管理子线程的方式也有一些未定义的行为.无法保证线程将在while循环的当前迭代结束之前启动main(),此时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;
}
Run Code Online (Sandbox Code Playgroud)