我有以下问题:
我必须从各种终端启动一个进程,但我只能在一定数量的进程启动后才开始运行程序。换句话说,我必须以某种方式阻止进程,直到我获得正确数量的进程。
我正在尝试使用称为“服务器”的第一个进程使用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来检查哪个代码。但我想这没关系。
答案 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