我正在构建一个通过FIFO与其客户端进行通信的服务器。
到目前为止,我已设法创建一个FIFO,运行一个新线程,一旦消息到达FIFO并从线程输出消息。
问题是,只要客户端在管道中写入内容,服务器就会无限地打印消息(我正在while(1)
中的管道中读取。)
我的问题是:read
操作是否也应该从管道中删除消息,因此不会再次读取?这不是First In,First Out 的重点吗?这是我必须手动完成的吗?
这也是我的代码,如果有帮助:http://pastebin.com/Ag7vgrav
我在FIFO中写的只是:echo test > /home/ubuntu/work/my_fifo
答案 0 :(得分: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;
}