管道通信是一种进程间通信(IPC)的方式,它允许一个进程的输出作为另一个进程的输入,在Linux系统中,管道通信主要通过文件系统中的一个特殊文件——管道文件实现,管道文件分为两种类型:匿名管道和命名管道。
1、匿名管道的特点
只能用于具有父子关系的进程之间通信;
只能在创建管道的进程及其子进程中使用;
没有名字,以特殊文件的形式存在于文件系统中。
2、匿名管道的创建和使用
#include#include #include #include #include int main() { int pipefd[2]; // 定义一个匿名管道文件描述符数组 pid_t pid; // 定义一个进程ID变量 char buf[1024]; // 定义一个缓冲区 // 创建匿名管道 if (pipe(pipefd) == 1) { perror("pipe"); return 1; } // 创建子进程 pid = fork(); if (pid == 1) { perror("fork"); return 1; } else if (pid == 0) { // 子进程 close(pipefd[0]); // 关闭读端 write(pipefd[1], "Hello, parent!", strlen("Hello, parent!")); // 向管道写入数据 close(pipefd[1]); // 关闭写端 } else { // 父进程 close(pipefd[1]); // 关闭写端 read(pipefd[0], buf, sizeof(buf)); // 从管道读取数据 printf("Received from child: %s ", buf); // 输出接收到的数据 close(pipefd[0]); // 关闭读端 wait(NULL); // 等待子进程结束 } return 0; }
1、命名管道的特点
可以在任意两个进程之间进行通信,不受父子关系限制;
可以独立于创建它的进程而存在,可以被多个进程同时访问;
有名字,以特殊文件的形式存在于文件系统中。
2、命名管道的创建和使用
#include#include #include #include #include #include #include // 创建命名管道的头文件 #include // 关闭文件描述符的头文件 #include // 错误处理的头文件 #include // 字符串处理的头文件 #include // 等待子进程结束的头文件 #include // 信号处理的头文件 #include // socket编程相关的头文件 #include // socket编程相关的头文件 #include // inet地址结构体相关的头文件 #include // inet地址转换函数相关的头文件 #include // UNIX标准库头文件,包含了对POSIX操作系统API的定义,例如read函数、write函数等。