阅读量:0
进程间通信(IPC)是Linux系统下进程之间进行数据交换和同步的机制。常见的IPC方式包括管道、消息队列、共享内存、信号量等。
进程间通信的Linux小程序
进程间通信简介
进程间通信(IPC,Inter-Process Communication)是让不同的进程之间能够相互传递信息或数据的过程,在Linux系统中,常见的进程间通信方式包括管道、消息队列、共享内存、信号量、套接字等。
管道通信
2.1 无名管道
无名管道,也称为匿名管道,是一种半双工的通信方式,数据只能单向流动,通常用于父子进程之间的通信,创建无名管道的主要函数是pipe()
,该函数会返回两个文件描述符:一个用于读操作,另一个用于写操作。
特点
特征 | 描述 |
半双工 | 数据只能从写端流向读端,不能反向流动。 |
亲缘关系 | 只能用于具有亲缘关系的进程(如父子进程)之间的通信。 |
无实体 | 没有文件实体,仅存在于内存中。 |
阻塞性 | 默认情况下,如果读端没有数据,则读操作会阻塞;如果写端缓冲区已满,则写操作会阻塞。 |
示例代码
#include <unistd.h> #include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int pipefd[2]; pid_t pid; char buf[100]; if (pipe(pipefd) == -1) { perror("pipe"); exit(EXIT_FAILURE); } pid = fork(); if (pid > 0) { // 父进程 close(pipefd[0]); // 关闭读端 write(pipefd[1], "Hello, child!", 15); close(pipefd[1]); } else if (pid == 0) { // 子进程 close(pipefd[1]); // 关闭写端 read(pipefd[0], buf, sizeof(buf)); printf("Parent message: %s ", buf); close(pipefd[0]); } else { perror("fork"); exit(EXIT_FAILURE); } return 0; }
2.2 有名管道(FIFO)
有名管道(FIFO,First In First Out)是对无名管道的改进,可以在任意两个不相关的进程之间进行通信,FIFO与文件系统中的文件类似,可以通过路径名来访问。
特点
特征 | 描述 |
可命名 | 通过路径名进行标识和访问。 |
持久性 | 即使没有进程在使用,FIFO仍然驻留在文件系统中。 |
双向通信 | 支持双向通信,但在同一时刻只能由一个进程写入,一个进程读取。 |
阻塞性 | 默认情况下,如果读端没有数据,则读操作会阻塞;如果写端缓冲区已满,则写操作会阻塞。 |
示例代码
#include <fcntl.h> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int fd; mkfifo("my_fifo", 0666); // 创建FIFO pid_t pid = fork(); if (pid > 0) { // 父进程 fd = open("my_fifo", O_WRONLY); // 打开FIFO进行写操作 write(fd, "Hello, child!", 15); close(fd); } else if (pid == 0) { // 子进程 fd = open("my_fifo", O_RDONLY); // 打开FIFO进行读操作 read(fd, buf, sizeof(buf)); printf("Parent message: %s ", buf); close(fd); } else { perror("fork"); exit(EXIT_FAILURE); } unlink("my_fifo"); // 删除FIFO return 0; }
常见问题与解答
问题1: 为什么使用无名管道时,需要关闭不需要的读端或写端?
答案: 在使用无名管道时,如果不关闭不需要的读端或写端,可能会导致死锁,如果父进程没有关闭写端,那么子进程在读取完数据后可能会一直等待新的数据到来,从而造成死锁,为了确保数据的顺利传输,必须关闭不需要的读端或写端。
问题2: 有名管道与无名管道有什么区别?
答案: 无名管道只能在具有亲缘关系的进程(如父子进程)之间使用,而有名管道可以在任意两个不相关的进程之间进行通信,无名管道没有文件实体,而有名管道则有一个路径名与之对应,并且即使没有进程在使用,它仍然驻留在文件系统中。
以上就是关于“关于进程间通信的Linux小程序”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!