【发布时间】:2015-07-23 13:27:57
【问题描述】:
我正在尝试通过命名管道使用 IPC 在两个进程之间创建一个非常基本的客户端服务器通信。
我有 2 个管道,分别是 fifo_client 和 fifo_server
我有以下两个类 fifoclient.c 和 fifoserver.c 具有以下代码行来打开两个管道。
fifoclient.c
int client = open("fifo_client",O_WRONLY);
int server = open("fifo_server",O_RDONLY);
fifoserver.c
int client = open("fifo_client",O_RDONLY);
int server = open("fifo_server",O_WRONLY);
但是,只需更改在fifoserver.c 中打开client 和server 管道的顺序,程序就会冻结。
这是代码冻结时的编写方式:
fifoserver.c
int server = open("fifo_server",O_WRONLY);
int client = open("fifo_client",O_RDONLY);
请注意,在这种情况下,server 管道在 client 管道之前打开。这会导致程序没有响应(可能是竞态条件?)。
谁能解释发生了什么以及为什么?
编辑:
以下是这两个类的完整代码:
fifoserver.c
#define BUFSIZE 20
#include<stdio.h>
#include<fcntl.h>
int main()
{
char buf[BUFSIZE];
int client = open("fifo_client",O_RDONLY);
int server = open("fifo_server",O_WRONLY);
if( server<0 || client < 0)
{
printf("Couldn't open file\n");
exit(1);
}
read(client,buf,BUFSIZE*sizeof(char));
printf("Client Says: %s\n",buf);
write(server,"Fine, Thank You!",BUFSIZE*sizeof(char));
close(server);
close(client);
return 0;
}
fifoclient.c
#define BUFSIZE 20
#include<stdio.h>
#include<fcntl.h>
int main()
{
char buf[BUFSIZE];
int client = open("fifo_client",O_WRONLY);
int server = open("fifo_server",O_RDONLY);
if(client <0 || server <0)
{
printf("ERROR! Couldn't open file!\n");
exit(1);
}
write(client,"Hello! How are you?",BUFSIZE*sizeof(char));
read(server,buf,BUFSIZE*sizeof(char));
printf("Server Says: %s\n",buf);
close(server);
close(client);
return 0;
}
【问题讨论】:
-
如果不看这两个文件中的代码就无法判断,但我猜客户端和服务器希望他们的连接握手以特定顺序发生。
-
你正在使用阻塞
open、read和write,所以调用顺序很重要。
标签: c pipe ipc named-pipes