📅  最后修改于: 2023-12-03 15:36:41.158000             🧑  作者: Mango
管道(pipe)是一种进程间通信的机制,在 C 语言中,使用管道可以实现子进程和父进程之间的双向通信。在本文中,我们将介绍如何使用管道在 C 语言中实现双向通信。
管道是一种在进程之间传递数据的机制,它可以在进程之间传递字节流,类似于文件的读写操作。在 C 语言中,管道通过以下函数创建:
int pipe(int fd[2]);
该函数会创建一个管道,fd 数组包含两个文件描述符,fd[0] 表示管道的读端,fd[1] 表示管道的写端。当一个进程向管道的写端写入数据时,另一个进程可以从管道的读端读取数据。
以下是使用管道在 C 语言中实现双向通信的代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#define BUFFER_SIZE 25
#define READ_END 0
#define WRITE_END 1
int main()
{
char write_msg[BUFFER_SIZE] = "Hello, World!";
char read_msg[BUFFER_SIZE];
int fd[2];
pid_t pid;
// 创建管道
if (pipe(fd) == -1) {
fprintf(stderr, "Pipe failed");
return 1;
}
// 创建子进程
pid = fork();
if (pid < 0) {
fprintf(stderr, "Fork failed");
return 1;
}
// 子进程
if (pid == 0) {
// 关闭写端
close(fd[WRITE_END]);
// 读取父进程发送的数据
read(fd[READ_END], read_msg, BUFFER_SIZE);
printf("Child process received: %s\n", read_msg);
// 关闭读端
close(fd[READ_END]);
} else { // 父进程
// 关闭读端
close(fd[READ_END]);
// 向子进程发送数据
write(fd[WRITE_END], write_msg, BUFFER_SIZE);
// 关闭写端
close(fd[WRITE_END]);
}
return 0;
}
在以上代码中,当程序执行到 pipe(fd)
时,会创建一个管道,并将读端和写端的文件描述符存入数组 fd 中。接着,使用 fork()
函数创建一个子进程。
在子进程中,先关闭管道的写端,然后通过 read()
函数读取管道的数据,并将数据存入 read_msg
数组中。最后,关闭管道的读端。
在父进程中,先关闭管道的读端,然后使用 write()
函数将数据写入管道中,最后关闭管道的写端。注意,写入管道的数据大小不能超过 BUFFER_SIZE
。
运行以上代码后,可以看到子进程输出了父进程发送的数据:
Child process received: Hello, World!
使用管道可以方便地在 C 语言中实现进程间的通信。在以上代码示例中,我们使用管道实现了父进程向子进程发送数据,并由子进程读取数据的功能。当然,我们也可以通过该方法实现更为复杂的通信功能。