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
您需要检查返回代码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)