unix 进程间通讯¶
1 pipe¶
https://zhuanlan.zhihu.com/p/58489873 在 Linux 中,管道(pipe)是一种用于进程间通信的机制,允许一个进程将其输出发送到另一个进程的输入。这种通信是通过在一个进程的标准输出(stdout)和另一个进程的标准输入(stdin)之间建立的。管道通常用于将一个进程的输出传递给另一个进程,从而创建进程之间的数据流。
下面是有关 Linux 管道通信的一些关键概念和用法:
- 创建管道:
-
在 Linux 中,你可以使用
pipe()
系统调用来创建一个管道。这个系统调用会返回两个文件描述符,一个用于读取数据,另一个用于写入数据。通常,父进程创建管道,并将一个文件描述符传递给子进程,从而实现进程之间的通信。 -
命令行管道:
-
你可以使用命令行中的管道操作符
|
来创建简单的进程间管道通信。例如,command1 | command2
将command1
的输出传递给command2
的输入。 -
C 编程中的管道通信:
- 在 C 编程中,你可以使用
pipe()
系统调用创建管道,并使用fork()
创建子进程。然后,子进程可以关闭管道的不需要的文件描述符,然后使用write()
向管道写入数据,父进程可以关闭相反的文件描述符,并使用read()
从管道中读取数据。
#include <stdio.h>
#include <unistd.h>
int main() {
int pipefd[2];
char buffer[100];
// 创建管道
if (pipe(pipefd) == -1) {
perror("pipe");
return 1;
}
pid_t pid = fork();
if (pid == 0) {
// 子进程
close(pipefd[0]); // 关闭读取端
write(pipefd[1], "Hello, parent!", 14);
close(pipefd[1]);
} else {
// 父进程
close(pipefd[1]); // 关闭写入端
read(pipefd[0], buffer, sizeof(buffer));
printf("Received: %s\n", buffer);
close(pipefd[0]);
}
return 0;
}
- 管道的限制:
-
管道通信有一些限制,例如它只支持单向通信(父进程到子进程或反之),并且数据是流式的,没有消息边界。
-
命名管道:
- 除了普通管道外,Linux 还支持命名管道(FIFO),这是一种允许无关的进程通过文件系统进行通信的机制。