进程间通信(IPC)是指在不同进程之间传递信息。linux的进程通信方式有管道,消息队列,信号量,共享内存,套接口等方式,下面一一整理。
首先是管道(PIPE),管道是Unix系统IPC最古老的方式,所有的Unix系统都提供这种通信机制。它的优点在于简单易用,缺点在于有限制,详细见下面几点:
- 只能用于父子进程或兄弟进程之间通信
- 大多数系统中都是半双工的,数据信息只能单向流动,如果需要双向通信则需要建立两个管道
- 传输的是无格式字节流,需要双方约定格式
- 管道缓冲区是有限的,等等
首先来看父子进程之间通信的例子。
#include<stdio.h>
#include<limits.h>
#include<sys/types.h>
#include<string.h>
#include<stdlib.h>
#define BUFSIZE PIPE_BUF //管道默认一次性读取的数据长度
void err_quit(char *err) {
printf("%s\n",err);
exit(-1);
}
int main()
{
int fd[2];
char buf[BUFSIZE] = "hello my son";
pid_t pid;
if (pipe(fd) < 0) {
err_quit("pipe error");
}
if ((pid = fork()) < 0) {
err_quit("fork error");
}
else if(pid > 0) { //父进程
close(fd[0]);
write(fd[1], buf, strlen(buf));
}
else {
close(fd[1]);
int len = read(fd[0], buf, BUFSIZE);
if (len < 0) {
err_quit("read error");
}
printf("Get : %s\n",buf);
}
return 0;
}
接下来是兄弟进程之间通信的例子。
#include<stdio.h>
#include<limits.h>
#include<sys/types.h>
#include<string.h>
#include<stdlib.h>
#define BUFSIZE PIPE_BUF //管道默认一次性读取的数据长度
void err_quit(char *err) {
printf("%s\n",err);
exit(-1);
}
int main()
{
int fd[2];
char buf[BUFSIZE] = "hello my brother";
pid_t pid;
if (pipe(fd) < 0) {
err_quit("pipe error");
}
if ((pid = fork()) < 0) {
err_quit("fork error");
}
else if(pid > 0) { //父进程
if ((pid = fork()) < 0) {
err_quit("fork error");
}
else if (pid > 0) { //父进程
}
else {
close(fd[0]);
write(fd[1], buf, strlen(buf));
}
}
else {
close(fd[1]);
int len = read(fd[0], buf, BUFSIZE);
if (len < 0) {
err_quit("read error");
}
printf("Get : %s\n",buf);
}
return 0;
}
代码都很简单,只是需要记住在创建新进程后记得分别关闭读写描述符。如果想让子进程给父进程传递数据,则关闭父进程的写描述符和子进程的读描述符即可。利用管道可以做简单的进程同步工作,因为读端会一直阻塞到写端发出数据后再运行后面的代码,可以利用这个特点保证让指定的进程先运行。
分享到:
相关推荐
c语言实现的进程间通信,通信方式用管道,write接受到管道信息写文件
进程间通信之消息队列 ( message queue ) 消息队列是消息的链表,具有特定的格式,并由消息队列标识符标识. 七种进程间通信方式: 一.无名管道( pipe ) 二.有名管道( fifo ) 三.共享内存 ( shared memory ) 四....
### 实验一 进程通信——管道和信号实验报告 #### 实验背景及目标 本实验旨在通过实际操作深入理解进程通信的相关概念和技术,特别是管道和信号这两种进程间通信方式。实验目标具体包括: 1. **加深对进程概念的...
进程间通信(IPC)是多进程环境下必不可少的技术之一。这部分可能介绍了管道、信号量、共享内存等IPC机制。 #### 高级算法 在算法基础之上,这部分内容可能会进一步探讨更复杂的数据处理技术,例如图论算法(如...
通过理解和掌握这个项目,我们可以深入理解C语言的多进程编程以及进程间通信的机制。 首先,我们要了解C语言在多进程编程中的基本概念。C语言提供了创建、管理进程的系统调用,如`fork()`用于创建子进程,`exec()`...
首先,我们关注的是进程间通信的一个常见方法——管道(Pipe)。管道是一种半双工通信方式,允许数据在一个方向上流动。在实验中,我们使用`pipe()`函数创建了一个管道。`pipe()`函数接受一个整型数组`filedes[2]`...
【管道驱动程序开发】在操作系统中,管道是一种重要的进程间通信(IPC)机制,它允许进程之间通过字节流方式交换信息。在Linux系统中,管道的实现涉及到内核空间的操作,因此通常需要通过设备驱动程序来管理。本文将...
管道(包括无名管道和命名管道)为进程间通信提供了一种简单而有效的方式。通过合理地选择和使用这些机制,可以极大地提高程序的设计灵活性和性能效率。无论是简单的父子进程通信还是更复杂的多进程数据交换场景,...
本实验旨在通过具体的编程实践,加深学生对进程间通信(IPC)机制之一——管道通信的理解与掌握。实验中,参与者将学习如何利用系统调用`pipe()`、`close()`、`write()`以及`read()`来实现父子进程之间的数据传输。 ...
标题中的“用Linux语言编程的管道通信程序”指的是在Linux操作系统环境下,利用C语言或者其他支持系统调用的编程语言,实现进程间通信的一种方法——管道通信。管道是Linux提供的一种简单且有效的方式,允许不同进程...
管道文件用于进程间通信。`pipe()`函数创建一个管道,返回两个文件描述符,一个用于写入,一个用于读取。例如,`pipe(fd)`创建管道后,`fd[0]`用于读,`fd[1]`用于写。 总结来说,Linux下的C语言编程中,文件操作...
本实验旨在通过实践操作,帮助学习者深入了解进程间通信的基本原理和技术之一——管道通信。管道是一种用于连接进程的标准输入输出流,允许一个进程(通常称为生产者)写入数据,另一个进程(通常称为消费者)读取...
4. **信号**:信号是一种进程间通信方式,用于通知进程发生了某个事件。 #### 进程间通信(IPC) 进程间通信(Inter-Process Communication, IPC)是指不同进程之间交换数据或协调彼此行为的方式。Linux提供了多种...
同时,也学习了进程间如何通过管道进行通信,这对于实现分布式系统、多线程编程和并发操作有重要意义。实验报告的最后部分,要求学生根据实验结果撰写实验心得,这有助于巩固理论知识,并培养问题解决和分析能力。
通常用于临时性的进程间通信。 ##### 2. 信号量 信号量是一种可以多进程共享的变量,用于解决进程间的同步问题,防止数据访问冲突。 ##### 3. 共享内存 共享内存使得多个进程可以访问同一块内存区域,是最快的...
本实验“FIFO管道命名实验”聚焦于一种特定的进程间通信(IPC)方式——命名管道(Named Pipe),也称为FIFO(先进先出)文件。下面我们将深入探讨命名管道的概念、工作原理以及如何通过C语言实现。 命名管道是Unix...
4. 进程间通信:了解管道、消息队列、共享内存、套接字等进程间通信方式。 七、系统安全与防火墙 1. SSH安全:学会配置SSH服务,提高远程登录的安全性。 2. 权限策略:设置sudo,实现非root用户的权限控制。 3. ...