📜  管道系统调用 - C 编程语言(1)

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

管道系统调用 - C 编程语言

管道是在进程间通信中常用的一种通信方式。通过管道,一个进程可以把数据发送给另一个进程,实现进程之间的数据共享。

在 C 语言中,管道可以通过系统调用函数来实现。下面是关于管道系统调用的介绍。

管道系统调用函数

在 C 语言中,可以使用 pipe() 函数创建一个管道。该函数定义如下:

#include <unistd.h>

int pipe(int pipefd[2]);

其中 pipefd 是一个整型数组,数组长度为 2,用来存储管道的文件描述符。pipefd[0] 表示管道的读端,pipefd[1] 表示管道的写端。

管道读写操作

通过管道读写操作,进程之间可以进行数据通信。在 C 语言中,可以使用 read()write() 系统调用函数实现来进行读写操作。

管道写入操作

通过 write() 函数可以向管道中写入数据。该函数定义如下:

#include <unistd.h>

ssize_t write(int fd, const void *buf, size_t count);

其中 fd 是管道的写端文件描述符,buf 是要写入的数据缓存,count 是要写入的数据长度。

管道读取操作

通过 read() 函数可以从管道中读取数据。该函数定义如下:

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);

其中 fd 是管道的读端文件描述符,buf 是读取数据的缓存,count 是要读取的数据长度。

管道例子

下面是一个简单的示例程序,演示了如何使用管道进行进程间通信:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int main()
{
    int fd[2];
    char buf[1024];

    if (pipe(fd) == -1) {
        perror("pipe");
        exit(EXIT_FAILURE);
    }

    pid_t pid = fork();

    if (pid == -1) {
        perror("fork");
        exit(EXIT_FAILURE);
    }

    if (pid == 0) {         // 子进程
        close(fd[0]);       // 关闭子进程的读端

        char *msg = "Hello, parent!";
        write(fd[1], msg, strlen(msg));
        close(fd[1]);       // 关闭子进程的写端
        exit(EXIT_SUCCESS);
    } else {                // 父进程
        close(fd[1]);       // 关闭父进程的写端

        ssize_t count = read(fd[0], buf, sizeof(buf));
        printf("Received message from child: %.*s\n", (int)count, buf);

        close(fd[0]);       // 关闭父进程的读端
        exit(EXIT_SUCCESS);
    }
}

该程序创建了一个管道,然后创建了一个子进程,子进程向管道中写入了一条消息,父进程则从管道中读取并打印出该消息。

总结

管道是进程间通信中常用的一种方式,可以用来实现进程之间的数据共享。在 C 语言中,可以使用 pipe()read()write() 系统调用函数来实现对管道的创建、读写操作。