带有命名管道的 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 的部分只能在fork
ed 进程中使用。要在两个独立进程之间使用它,您需要命名管道(或 Linux procfs
)。请参阅手册页:pipe(2)
、mkfifo(1)
、mkfifo(3)
。在 procfs 中,要像普通文件一样访问其他进程的 FD,请使用路径:/proc/<PID>/fd/<FD>
。以上是关于带有命名管道的 C 中的 IPC的主要内容,如果未能解决你的问题,请参考以下文章