进程间通信(ipc)
应用场景:
数据传输
资源共享
通知事件
进程控制
system v at&t system v
posix(portable operating system interface)可移植操作系统接口
常用的进程间通信的方式:
管道(pipe)和有名管道(fifo)
信号(signal)
消息队列
共享内存
信号量
套接字(socket)
管道通信
半双工的,数据只能向一个方向流动
只能用于父子进程间或兄弟进程间
先进先出,一个进程在管道的尾部写入数据,另一个进程从管道的头部读出数据
无名管道 用于父子进程间的通信
创建管道
int pipe(int filedis[2])
管道建立时,所创建的两个文件描述符
filedis[0] 管道的读取端
filedis[1] 管道的写入端
关闭管道
将两个文件描述符关闭
示例代码如下:
#include <unistd.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
int main(){
int pipe_fd[2];
if(pipe_fd<0){
printf("pipe create error\n");
return -1;
}else{
printf("pipe create success\n");
}
close(pipe_fd[0]);
close(pipe_fd[1]);
}
管道的读写
选创建一个管道,通过fork()函数创建一个子进程,子进程会继承父进程所创建的管道
示例代码如下:
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
int main(){
int pipe_fd[2];
pid_t pid;
char buf_r[100];
char *p_wbuf;
int r_num;
memset(buf_r,0,sizeof(buf_r));
/*创建管道*/
if(pipe(pipe_fd)<0){
printf("create pipe error\n");
return -1;
}
/*创建子进程*/
if((pid=fork())==0){//子进程中运行
printf("\n");
close(pipe_fd[1]);
sleep(2);
if((r_num=read(pipe_fd[0],buf_r,100))>0){
printf("%d number read form the pipe is %s\n",r_num,buf_r);
}
close(pipe_fd[0]);
exit(0);
}
else if(pid>0){//父进程中运行
close(pipe_fd[0]);
if(write(pipe_fd[1],"hello",5)!=-1){
printf("parent write1 hello!\n");
}
if(write(pipe_fd[1]," pipe",5)!=-1){
printf("parent write2 page!\n");
}
close(pipe_fd[1]);
sleep(3);
waitpid(pid,NULL,0);
exit(0);
}
}
运行结果如下:
[retacn@localhost tmp]$ gcc pipe_rw.c -o pipe_rw
[retacn@localhost tmp]$ ./pipe_rw
parent write1 hello!
parent write2 page!
10 number read form the pipe is hello pipe
有名管道 用于运行于同一系统中的任意两个进程间的通信
fifo,与无命管道的区别是不相关的进程也能交换数据
建立命名管道
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname,mode_t mode)
pathname:fifo文件名
mode:属性
当使用open打开fifo文件时,O_NONBLOCK会产生以下影响
使用时,访问要求无法满足时不阻塞,立即返回,errno是enxio
不使用时,访问要求无法满足时进程将阻塞
示例代码如下:
fifo_read.c
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <memory.h>
#define FIFO "/home/retacn/tmp/myfifo"
main(int argc,char *argv){
char buf_r[100];
int fd;
int nread;
/*创建管道*/
if((mkfifo(FIFO,O_CREAT|O_EXCL)<0)&&(errno!=eexist)){
printf("cannot create fifoserver\n");
}
printf("preparing for reading bytes...\n");
memset(buf_r,0,sizeof(buf_r));
/*打开管道*/
fd=open(FIFO,O_RDONLY|O_NONBLOCK,0);
if(fd==-1){
perror("open");
exit(1);
}
while(1){
memset(buf_r,0,sizeof(buf_r));
if((nread=read(fd,buf_r,100))==-1){
if(errno==EAGAIN){
printf("no data yet\n");
}
}
printf("read %s form fifo\n",buf_r);
sleep(1);
}
/*暂停,等待信号*/
pause();
}
fifo_write.c
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <memory.h>
#define FIFO_SERVER "/home/retacn/tmp/myfifo"
main(int argc,char **argv){
int fd;
char w_buf[100];
int nwrite;
/*打开管道*/
fd=open(FIFO_SERVER,O_WRONLY|O_NONBLOCK,0);
if(argc==1){
printf("please send sonething\n");
exit(-1);
}
strcpy(w_buf,argv[1]);
/*向管道写入数据*/
if((nwrite=write(fd,w_buf,100))==-1){
if(errno==EAGAIN){
printf("the fifo has not been read yet,please try
later\n");
}
}else{
printf("write %s the fifo\n",w_buf);
}
}
- 浏览: 263166 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (303)
- c (31)
- c++ (16)
- java (18)
- c# (1)
- python (3)
- java web (6)
- oracle (7)
- sqlserver (2)
- mysql (2)
- android (24)
- android系统 (15)
- android多媒体部分 (15)
- android游戏 (12)
- linux (26)
- javaScript (1)
- ajax (1)
- node JS (2)
- html (5)
- apache (3)
- jboss (1)
- weblogic (0)
- 通信协议 (10)
- 云计算 (1)
- 分布式 (5)
- ejb (1)
- webservice (5)
- 设计模式 (16)
- JNI (6)
- swing (13)
- 版本控制 (1)
- UML (1)
- xml (4)
- spring (5)
- hibernate (5)
- struts1 (3)
- struts2 (4)
- ibatis (0)
- tomcat (2)
- 心得体会 (1)
- css (1)
- 嵌入式 (41)
- arm体系结构 (10)
发表评论
-
u-boot Makefile 文件分析
2013-06-01 21:44 2429Makefile文件分析 # #(C)Copyri ... -
uboot start.S文件分析
2013-06-03 22:18 1325U-boot第一个开始文件arch\arm\cpu\arm1 ... -
u-boot mkconfig文件分析
2013-05-31 21:29 1140Mkconfig文件分析 #!/bin/ ... -
链接地址学习笔记
2013-05-05 12:40 1287链接地址 启动过程 示例代码如下: ... -
DDR学习笔记
2013-05-11 14:19 1041DDR 15条地址线32k 128M*2(20)=2(2 ... -
nand flash学习笔记一
2013-05-13 21:05 961Nandflash 原理图上有data0-data7 ... -
openJTAG学习笔记一
2013-05-22 21:45 2183安装软件 光盘Windows\install目录下的 01.O ... -
linux进程管理学习笔记
2013-03-28 20:57 1367linux 进程管理 1 linux进程控制 进程的四个要素: ... -
字符设备驱动程序学习笔记一
2013-04-01 21:55 888linux 驱动程序 字符设备驱动程序 网络接口驱动程序 块设 ... -
字符设备驱动程序学习笔记二
2013-04-04 10:29 754字符驱动程序 1 设备号 字符设备通过字符设备文件来存取 ls ... -
字符设备驱动程序学习笔记三
2013-04-04 14:03 789memdev.h文件示例代码如下: #ifndef _MEM ... -
字符设备驱动程序学习笔记四
2013-04-05 11:12 589竟争与互斥 程序调试 1 ... -
GPIO学习笔记
2013-04-14 19:50 813用汇编点亮一个led 1看原理图GPK4=0,led亮G ... -
系统时钟学习笔记
2013-05-04 21:59 83712m晶振----->pll------>cpu ... -
UART学习笔记
2013-05-04 22:00 1167串口(UART) DIV_VAL=(PCLK/(bpsx1 ... -
linux内存管理学习笔记
2013-03-12 20:50 10781 linux内存管理 地址类型 物理地址 出现在cpu地址 ... -
嵌入式linux系统学习笔记
2013-03-06 21:39 973嵌入式linux内核制作 1 清除原有配置文件与中间文件 x8 ... -
原理图学习笔记一
2013-02-17 22:24 425画个草图也挺过瘾 -
进程间通信学习笔记二(信号通信)
2013-02-16 21:39 793信号通信 用户按某些键时,产生信号 硬件异常产生信号 进程用k ... -
进程间通信学习笔记三(共享内存通信)
2013-02-16 21:40 608共享内存通信 被多个进程共享的一部分物理内存,是进程间共享数据 ...
相关推荐
本学习笔记将深入探讨信号量和进程间通信的相关概念、原理以及实际应用。 首先,让我们理解什么是进程。进程是程序执行的实例,拥有独立的内存空间和系统资源,它们在操作系统中并行运行。在多进程环境中,为了协调...
本教程聚焦于MFC中的一个重要概念——进程间通信(Inter-Process Communication,IPC)。进程间通信允许不同的进程之间交换数据,共享资源,协同工作,是Windows编程中的关键技能。Lesson 17的MFC教程将深入探讨这一...
总的来说,该读书笔记覆盖了操作系统设计中的核心知识点——进程间通信,深入解析了各种通信机制的工作原理和实现方式,对于操作系统爱好者和开发者来说,是一份非常宝贵的参考资料。通过学习和实践,我们可以提高在...
《ORANGE’S:一个操作系统的实现》这本书深入浅出地介绍了操作系统的设计与实现,其中第25章专注于进程间通信的探讨,特别是第三部分。这里我们将结合书中的内容和提供的代码,详细解析这一关键知识点。 首先,...
管道是一种半双工的数据通信通道,允许两个进程通过共享内存区域交换数据,常用于实现简单的进程间通信或构建复杂的命令行管道。 综上所述,这份学习笔记全面覆盖了操作系统的核心概念,从底层的保护模式编程到高层...
- 邮槽是一种轻量级的进程间通信机制,适用于小数据量的传输。 5. **Windows套接字(Sockets)** - 主要用于网络通信,也可以用于本地进程间的通信。 #### 二、设置进程优先级 为了确保进程在执行时不会受到其他...
Linux提供了多种机制来实现进程间通信(IPC),包括信号、管道、消息队列、共享内存和信号量等。 #### 线程管理 在Linux中,线程的创建和管理主要通过`pthread`库实现,其中`pthread_create()`用于创建新线程,`...
本文主要探讨了操作系统中的进程与线程,以及进程间通信的基础概念。 一、进程 进程是操作系统中运行程序的实例,它包含了程序的代码、数据、状态信息等。一个进程在某一时刻可能处于运行、就绪、阻塞三种状态之一...
1. 进程间通信(IPC, Inter-Process Communication):这是跨进程的核心,包括管道、共享内存、消息队列、套接字、命名管道等多种方式。每种方式都有其适用场景和优缺点,需要根据实际需求选择。 2. 同步与互斥:当...
- **进程间通信(IPC)**:Linux提供了多种进程间通信机制,如管道、消息队列、共享内存、信号量等。 - **线程编程**:多线程编程可以利用多核处理器的并行计算能力,提高程序的执行效率。 - **同步与互斥**:为了...
进程间的同步和互斥是操作系统的重要概念,P/V操作是实现这两个概念的低级通信原语,用于控制对临界资源的访问。高级通信如共享存储、消息传递和管道通信则提供了更复杂的交互方式。 在处理机与进程管理部分,线程...
7. **进程管理**:包括进程查看(ps、top)、启动与停止进程(start、stop、kill命令),以及进程间通信。 8. **网络配置与管理**:涵盖网络接口配置、DNS解析、路由设置,以及网络服务如SSH、FTP的启用。 9. **...
* 进程通信:使用管道、信号、Socket 等方式实现进程间通信 五、Vim 编辑器 * Vim 编辑器的基本概念:命令模式、插入模式、末行模式 * Vim 编辑器的基本命令:i、a、o、w、q 等 * Vim 编辑器的高级功能:宏命令、...
最后,熟悉一些高级主题,如进程间通信(IPC,如管道、信号、共享内存和消息队列),以及如何利用cron服务定时执行任务,将让你的Linux技能更上一层楼。 总的来说,这份“Linux Shell个人学习笔记”涵盖了从基础...
6. **文件I/O和管道通信**:Unix的文件系统模型使得一切皆为文件,因此理解和掌握文件I/O操作是必要的。同时,笔记可能涉及到了进程间的通信机制,如管道、套接字等,这些都是Unix多进程编程的关键。 7. **编译和...
- 管道和FIFO:了解进程间通信(IPC)方式,如管道和命名管道(FIFO)的使用。 - 线程:掌握pthread库,包括线程的创建、同步和通信。 5. **信号处理**: - 信号:理解Linux中的信号机制,如何注册信号处理函数...
- **管道**: 管道是一种进程间通信方式,允许一个进程的输出作为另一个进程的输入。 - **消息队列**: 消息队列是一种用于在进程间传递消息的机制。 - **信号量数组**: 信号量数组可以用于控制多个资源的访问。 - ...
进程间通信(IPC)允许独立的进程交换数据,常见的IPC方法包括管道(pipes)、消息队列、共享内存等。 ### Unix/Linux系统的网络编程 网络编程是Linux下C语言开发的核心内容之一,涉及套接字编程,用于实现网络...
#### Lesson17: 进程间通信 - 进程之间通过管道、共享内存等方式交换数据。 #### Lesson18: ActiveX控件 - 创建和使用ActiveX控件,增强应用程序的功能。 #### Lesson19: 动态链接库DLL - 创建和使用动态链接库...