FIFO 通信问题 [已修复]

FIFO communication issue [Fixed]

提问人:Harvey Yeh 提问时间:11/12/2023 最后编辑:Harvey Yeh 更新时间:11/12/2023 访问量:34

问:

我正在练习linux fifo的读写。我创建了两个文件。一个是 client.c,另一个是 server.c。我正在尝试交换两个程序的名称。所以我创建了两个 fifo。客户端首先写入 AToB fifo,等待服务器读取。然后客户端等待服务器写入 BToA fifo。

为什么两个节目都没有进行到最后,似乎两个都在等待对方?

我的结果如下:

enter image description here

客户端.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;
}


服务器.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。如果我像下面这样修改代码,它将起作用。

 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);
C Linux 进程 FIFO

评论

0赞 Shawn 11/12/2023
客户端正在等待 AToB 的读取端被打开,服务器正在等待 BToA 的读取端被打开。僵局。
0赞 Harvey Yeh 11/12/2023
@Shawn 但是,在完成AToB数据传输后,两个程序不应该都进入BToA fifo吗?因为我认为FIFO在阻塞。那么,只有在他们读写AToB fifo之后,他们才会进入BToA?
1赞 Craig Estey 11/12/2023
您应该将更新转换为答案。然后,您可以接受它。这样你会得到更多的代表
0赞 Shawn 11/12/2023
不。打开一个 fifo 会阻塞,直到其他东西打开另一端。您的程序永远不会超过它们的第一个.open()
0赞 Rob 11/12/2023
请勿发布代码、数据、错误消息等的图像。- 将文本复制或键入到问题中。如何提问

答:

1赞 Harvey Yeh 11/12/2023 #1

更新: 我自己解决了这个问题。似乎我无法一次打开多个 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);