You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 06:47:08