2个FIFO 1任务 - 同步它们

时间:2013-05-21 02:27:40

标签: c fifo

我有以下问题:

我必须从各种终端启动一个进程,但我只能在一定数量的进程启动后才开始运行程序。换句话说,我必须以某种方式阻止进程,直到我获得正确数量的进程。

我正在尝试使用称为“服务器”的第一个进程使用FIFO。该问题作为故障单入口问题重新开始:“服务器”进程始终写入FIFO,该FIFO将是下一个进程的编号。下一个过程取其“票”并将“他的号码”发送给“服务器”。我的编码基本上是这样的:

SERVER:

count = 0;
fd_w = open ("client", O_WRONLY);
fd_r = open ("server", O_RDONLY);
do {
    write (fd_w, &count, sizeof(int)); //Write on client's reading FIFO
    read (fd_r, &count, sizeof(int));  //Read what clients wrote
    printf ("Msg read: %d\n", count);
} while (count != 4);

printf ("Starting...\n");

客户端:

fd_r = open ("client", O_RDONLY);
fd_w = open ("server", O_WRONLY);

read (fd_r, &count, sizeof(int)); // Read the ticket from server

count++;

write (fd_w, &count, sizeof(int)); // Write what should be the next ticket

//Wait until we have 4 processes

服务器等待第一个调用,但是当第一个进程到达时,它会正确读取服务器消息,将消息放回服务器,但服务器以某种方式在循环中交互1或2(似乎有点随机)并简单地结束。甚至没有打印“正在开始...”。任何想法为什么会发生这种情况?此外,任何想法我应该如何通知其他进程他们可以继续?

如果重要的话,我实际上是在为服务器和客户端使用相同的代码,我通过测试是否已创建“服务器”FIFO来检查哪个代码。但我想这没关系。

1 个答案:

答案 0 :(得分:1)

您的程序存在多个问题。首先请注意,FIFO语义与常规文件不同。

如果以只读(O_RDONLY)或只写(O_WRONLY)模式打开FIFO,那些打开的调用将会阻塞,直到FIFO也以只写/读写({{ 1}})或只读(O_RDONLY)模式。如果您希望打开的调用立即返回而不管上述情况如何,则必须以非阻塞和只读(O_WRONLY/O_RDWR)模式或读写模式(O_RDONLY | O_NONBLOCK)打开FIFO。

如果使用(O_RDWR)标志打开,那么除非FIFO也未打开进行写入,否则每次O_RDONLY | O_NONBLOCK都会立即收到EAGAIN错误。但是如果你为读取和写入(read())打开它,那么你的读取将被阻塞,直到FIFO中的数据可用。这是有道理的,因为它确保在此FIFO上至少有一个写入器和一个读取器。

此外,您还没有在代码中进行错误检查,这会混淆编码错误并使调试更加困难。

我修复了O_RDWR代码,以便按预期工作。

SERVER