跳转至

unix 进程间通讯

1 pipe

https://zhuanlan.zhihu.com/p/58489873 在 Linux 中,管道(pipe)是一种用于进程间通信的机制,允许一个进程将其输出发送到另一个进程的输入。这种通信是通过在一个进程的标准输出(stdout)和另一个进程的标准输入(stdin)之间建立的。管道通常用于将一个进程的输出传递给另一个进程,从而创建进程之间的数据流。

下面是有关 Linux 管道通信的一些关键概念和用法:

  1. 创建管道:
  2. 在 Linux 中,你可以使用 pipe() 系统调用来创建一个管道。这个系统调用会返回两个文件描述符,一个用于读取数据,另一个用于写入数据。通常,父进程创建管道,并将一个文件描述符传递给子进程,从而实现进程之间的通信。

  3. 命令行管道:

  4. 你可以使用命令行中的管道操作符 | 来创建简单的进程间管道通信。例如,command1 | command2command1 的输出传递给 command2 的输入。

  5. C 编程中的管道通信:

  6. 在 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;
}
  1. 管道的限制:
  2. 管道通信有一些限制,例如它只支持单向通信(父进程到子进程或反之),并且数据是流式的,没有消息边界。

  3. 命名管道:

  4. 除了普通管道外,Linux 还支持命名管道(FIFO),这是一种允许无关的进程通过文件系统进行通信的机制。