带有命名管道的 C 中的 IPC

Posted

技术标签:

【中文标题】带有命名管道的 C 中的 IPC【英文标题】:IPC in C with named pipes 【发布时间】:2016-05-30 19:38:31 【问题描述】:

我试图在 C 中创建两个程序(A 和 B)。A 向 B 发送一个 char 数组,B 将另一个 char 放入他从 A 接收的 char 数组中并将其发送回 A。在 A 得到改进后来自 B 的 char 数组,他将打印它。

问题是,我不知道如何告诉 A,当他从 B 收到改进的 char 数组时,它应该先打印它

有人可以帮忙吗?

【问题讨论】:

您可能需要定义一个协议,以便 B 知道 A 何时完成发送,并且 A 知道 B 何时完成发送。如果您一次发送一个字符数组,它们之间有一个换行符,那么您可以通过发送"END\n" 来标记数组的结尾。 你试过什么?你能include你代码的相关部分吗? 我是***的新手,我在shell的vim编辑器中编写了代码,这就是为什么我不能复制并粘贴到这里。我拍了个画面上传到这里:www2.pic-upload.de/img/30808319/Untitled.png 另一个程序只是读取管道并在其中写入扩展的char数组 【参考方案1】:
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <stdio.h>

int main() 
        // Here we use A and B as parent and child, made by fork
        // This allows us to pass pipe FDs
        int inpipe[2];
        int outpipe[2];
        pipe(inpipe);
        pipe(outpipe);
        const int arr_len = 4;
        const char buf[arr_len] = "ABD"; // Character [3] is implicit NUL
        int x = fork();
        if(x == -1) 
                perror("Fork error");
        
        if(x == 0) 
                // Child
                char my_buf[arr_len];
                read(inpipe[0], my_buf, arr_len);
                // Improve it
                my_buf[2] = 'C'; // ABC looks better than ABD
                // Send it back
                write(outpipe[1], my_buf, arr_len);
                exit(0);
        
        char my_buf[4];
        write(inpipe[1], buf, arr_len);
        // Will lock waiting for data
        read(outpipe[0], my_buf, arr_len);
        // Close pipes
        close(inpipe[0]);
        close(inpipe[1]);
        close(outpipe[0]);
        close(outpipe[1]);
        // Dump it
        printf("%s\n", my_buf);
        return 0;

尝试运行这个例子,看看它在两个进程之间发送数组。如果不分叉另一个,唯一的问题是使用命名管道(将pipe 调用替换为mkfifo 调用,以及其他一些更改)。随意基于这个例子。也看看这个:

int ifd = mypipe[0], ofd = mypipe[1]; // mypipe is got somewhere before
FILE *istream = fdopen(ifd, "r"), ostream = fdopen(ofd, "w");
// Now use any stdio functions on istream and ostream

【讨论】:

非常感谢 Jakub,我回家后会在笔记本电脑上尝试一下。当我想在 2 个不同的进程中执行此操作时,我只需要在另一个函数中导​​出子块吗?然后我需要为 char 数组运行 A,然后 B 将其写回,然后 A 再次打印结果 是的。另请注意,带有int[2]s 的部分只能在forked 进程中使用。要在两个独立进程之间使用它,您需要命名管道(或 Linux procfs)。请参阅手册页:pipe(2)mkfifo(1)mkfifo(3)。在 procfs 中,要像普通文件一样访问其他进程的 FD,请使用路径:/proc/&lt;PID&gt;/fd/&lt;FD&gt;

以上是关于带有命名管道的 C 中的 IPC的主要内容,如果未能解决你的问题,请参考以下文章

IPC - 命名管道(fifo)- 使用

C/S模型之命名管道

IPC - 命名管道(fifo)- 使用

IPC - 命名管道(fifo)- 使用

IPC - 命名管道(fifo)- 使用

什么时候应该使用 fifo 文件/命名管道?