gpt4 book ai didi

c - 打开命名管道的顺序导致可能的竞争条件?

转载 作者:行者123 更新时间:2023-12-01 16:53:36 26 4
gpt4 key购买 nike

我正在尝试通过命名管道使用 IPC 在两个进程之间创建一个非常基本的客户端服务器通信。

我有2个管道,分别是fifo_clientfifo_server

我有以下两个类 fifoclient.cfifoserver.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 中简单地更改打开 clientserver 管道的顺序,程序就会卡住。

这是代码卡住时的编写方式:

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;
}

最佳答案

来自man 7 fifo:

The kernel maintains exactly one pipe object for each FIFO special file that is opened by at least one process. The FIFO must be opened on both ends (reading and writing) before data can be passed. Normally, opening the FIFO blocks until the other end is opened also.

换句话说,您的 open() 调用将阻塞,直到管道的另一端有进程。这不是竞争条件——而是死锁。如果进程没有以相同的顺序打开管道,它们将永远相互等待。因此,正如您所注意到的,解决方案是它们必须以相同的顺序打开 fifo。

关于c - 打开命名管道的顺序导致可能的竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30194837/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com