📌  相关文章
📜  使用管道在 C 中子进程和父进程之间进行双向通信 - C 编程语言(1)

📅  最后修改于: 2023-12-03 15:36:41.158000             🧑  作者: Mango

使用管道在 C 中子进程和父进程之间进行双向通信

管道(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 语言中实现进程间的通信。在以上代码示例中,我们使用管道实现了父进程向子进程发送数据,并由子进程读取数据的功能。当然,我们也可以通过该方法实现更为复杂的通信功能。