Linux FIFO通信进程互相等待死锁问题排查及修复
问题:Linux FIFO双向通信死锁问题
我正在练习Linux FIFO读写操作,编写了client.c和server.c两个程序,想要实现两个程序间的名称交换功能。为此创建了AToB和BToA两个FIFO,预期逻辑为client先向AToB写入数据,等待server读取后,再等待server向BToA写入数据。但实际运行时两个程序均无法执行到结束,出现互相等待的死锁情况。
运行现象
两个程序启动后都卡在执行流程中,无法完成名称交换并退出,呈现互相等待的状态。
client.c 代码
#include <stdio.h> #include <string.h> #include <fcntl.h> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> int main(int argc, char** argv) { char name[80]; char temp[80]; strcpy(name,"Harris"); name[strlen(name)]='\0'; printf("Original name: %s\n",name); char * myfifo = "AToB"; char * myfifo2 = "BToA"; mkfifo(myfifo, 0666); mkfifo(myfifo2, 0666); int fd = open(myfifo, O_WRONLY); int fd2 = open(myfifo2, O_RDONLY); write(fd, name, strlen(name)+1); close(fd); read(fd2, temp, sizeof(temp)); close(fd2); strcpy(name,temp); name[strlen(name)]='\0'; printf("After name: %s\n",name); return 0; }
server.c 代码
#include <stdio.h> #include <string.h> #include <fcntl.h> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> int main(int argc, char** argv) { char name[80]; char temp[80]; strcpy(name,"Amy"); printf("Original name: %s\n",name); char * myfifo = "AToB"; char * myfifo2 = "BToA"; int fd = open(myfifo2, O_WRONLY); int fd2 = open(myfifo, O_RDONLY); read(fd2, temp, sizeof(temp)); close(fd2); write(fd, name, strlen(name)+1); close(fd); strcpy(name,temp); name[strlen(name)]='\0'; printf("After name: %s\n",name); return 0; }
修复方案
已自行解决问题,核心原因是不能同时打开多个FIFO。调整代码的打开、读写、关闭顺序,先完成一个FIFO的写入/读取操作后,再处理另一个FIFO,修改后的代码片段如下:
int fd = open(myfifo, O_WRONLY); write(fd, name, strlen(name)+1); close(fd); int fd2 = open(myfifo2, O_RDONLY); read(fd2, temp, sizeof(temp)); close(fd2);
内容的提问来源于stack exchange,提问作者Harvey Yeh
相关产品推荐
相关产品推荐

