linux应用程序开发-进程通信(IPC)
IPC
why:
1.数据传输
2.资源共享
目的:
3.通知事件
4.进程控制
发展:
1.UNIX进程间通信
2.基于SYStem V
3.POSIX
方式分类:
1.pipe(管道) FIFO(有名管道)
2.signal
3.消息队列
4.共享内存
5.信号量
6.套接字(socket)
管道通信:单向,先进先出
创建
pipe:父子之间通讯
FIFO:任意
创建:
int pipe(int filedis[2]);
管道创建时,产生两个文件描述符:filedis[0]读管道,filedid[1]写管道。
关闭:
close(filedis[1,2])
关闭两个描述符
管道读写:
父进程写filedis[1],子进程读filedis[0]
fork必须再pipe之前创建。
有名管道:FIFO
创建
#include<sys/types.h>
#include<sys/stat.h>
int mkfifo(const char*pathname,mode_t mode);
pathname:FIFO文件名
mode:属性
操作
当打开FIFO时,标志(O_NONBLOCK)
1.没有使用时:访问无法满足时,进程堵塞
2.使用:访问无法满足时不阻塞,立刻出错返回,error=ENXIO
信号通讯:
信号类型:(30种)
e:
SIGINT:CRTL+C
SIGKILL:
处理;
1.忽略
SIGKILL,SIGSTOP不能忽略
2.执行用户希望的动作
3.执行默认动作(大多是忽略)
signal
#include<signal.h>
void(*signal(int signo,void (*fun)(int)))(int)//如何理解??
Func可能取值:
1.SIG_LGN:忽略此信号
2.SIG_DFL:按系统默认方式
3.信号处理函数名:使用该函数处理
共享内存:
被多个进程共享一部分物理内存
速度快,不需要额外访问函数
实现:
1.创建 shmget()
2.映射到具体进程shmat()
int shmget(key_t key,int size,int shmflg)
key:共享内存键值
0/IPC_PRIVATE 创建新的内存,成功返回共享内存标示符,失败环回-1.
int shmat(int shmid,char*shmaddr,int flag)
shmid:共享内存标示符
flag:决定以什么方式来确定映射地址,通常为0
成功返回映射地址,失败返回-1.
脱离:
int shmdt(char*ahmaddr)
发送:
kill:向自身或其他进程发送
rasie:自身
#include<sys/types.h>
#include<signal.h>
int kill(pid_t,int signo)
int rasie(int signo)
pid>0:
pid==0:同组
pid<0:发送给其进程组id等于|pid|的进程
pid==-1:所有进程
Alarm
unsigned int alarm(unsigned int seconds);
经过预定的时间,产生sigalrm信号,如果不捕捉,则终止该进程。
pause
使进程调用挂起,直到收到一个信号
int pause(void)
只有执行了一个信号处理函数后后,挂起才结束。
消息队列:链表,有特定格式
克服消息信息量少,管道无格式
分类:
posix
系统V:
持续性
内核重启,人工删除
键值:
key_t ftok(char*pathname,char proj)
返回文件对应键值
打开/创建
int msgget(key_t,int msgflg)
返回消息队列描述字
msgflg:标志位
IPC_CREAT:创建
IPC_EXCL:若存在,返回错误
IPC_NOWAIT:无法满足要求,不阻塞
创建:
1.没有于key对应的消息队列,且msgflg包含IPC_CREAT标志位
2.key参数为IPC_PRIVAT
发送消息
int msgsnd(int mysqid,struct msbuf*msgp,int msgsz,int msgflg)
struct msgbuf
{
long mtype; //消息类型
char mtext[1];//消息数据首地址
}
接收消息
int msgrcv(int msqid,struct msgbuf*msgp,int msgsz,long msgtyp,int msgflg)
信号量(信号灯)
保护临街资源,进程互斥,进程同步
分类
二值信号灯:只能去0,1
计数信号灯:可以大于1
创建/打开
int semget(key_t key,int nsems,int semflg)
操作:
int semop(int semid,struct sembuf *sops,unsigned nsops)
对信号量进行控制。
semid:信号集ID;
sops:是一个操作数组
nsops:sops所指向的数组元素个数。
linux应用程序开发-进程通信(IPC)的更多相关文章
- linux应用程序开发-进程程序设计
学习之前必须了解基本的概念: 进程,线程,进程3种状态,进程调度以及4种算法,进程同步,死锁,记不清的找度娘. 获取ID #include<sys/types.h> #include< ...
- 嵌入式Linux应用程序开发详解------(创建守护进程)
嵌入式Linux应用程序开发详解 华清远见 本文只是阅读文摘. 创建一个守护进程的步骤: 1.创建一个子进程,然后退出父进程: 2.在子进程中使用创建新会话---setsid(): 3.改变当前工作目 ...
- 【Chromium中文文档】跨进程通信 (IPC)
跨进程通信 (IPC) 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/I ...
- linux应用程序开发-文件编程-系统调用方式
在看韦东山视频linux驱动方面有一些吃力,究其原因,虽然接触过linux应用程序编程,但是没有深入去理解,相关函数用法不清楚,正好看到国嵌视频对这一方面讲的比较透彻, 所以把学习过程记录下来,也作为 ...
- 《嵌入式linux应用程序开发标准教程》笔记——6.文件IO编程
前段时间看APUE,确实比较详细,不过过于详细了,当成工具书倒是比较合适,还是读一读这种培训机构的书籍,进度会比较快,遇到问题时再回去翻翻APUE,这样的效率可能更高一些. <嵌入式linux应 ...
- Linux入门-程序开发
Linux程序开发 linux程序总体上来说是分两部分的: 1. 底层驱动程序开发: 2.应用层应用程序开发: 驱动程序 一般情况下驱动是跟内核与硬件有关系的,编程语言是C语言,需要懂一些硬件的知识, ...
- Linux从程序到进程
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在高级语言中,这些内存管理的细节对于用户来说不透明.在编程的时候,我们只需要记住上 ...
- linux下有名管道进程通信
一.任务 1.学习mkfifo等函数: 2.了解有名管道的特点.阻塞打开与非阻塞打开等: 3.编写一个关于有名管道进程通信的程序,并运行. 二.相关概念 1.相关函数 创建有名管道的函数是mkfifo ...
- 【Linux】程序、进程和线程的区别
程序.进程和线程的区别 程序是一组指令及参数的集合,指令按照既定的逻辑控制计算机运行.进程则是运行着的程序,是操作系统执行的基本单位.线程则是为了节省资源而可以在同一个进程中共享资源的一个执行单位. ...
随机推荐
- 今年暑假不AC
"今年暑假不AC?""是的.""那你干什么呢?""看世界杯呀,笨蛋!""@#$%^&*%...&quo ...
- UIDatePicker日期选取器
//定义显示日期的格式 NSDateFormatter *dateFormat = [[NSDateFormatter alloc]init]; //NSDateFormatterMediumStyl ...
- sqlserver中DATE类型的数据转化 CONVERT
主要描述的是SQL Server使用convert取得datetime日期数据的实际操作流程,在实际操作中用SQL Server数据库中用convert来获取datetime日期数据,以下实例包含各种 ...
- 报表控件NCreport教程:报表高级设计
本次文章中将讲解NCreport一些高级功能的应用,我们会先定义一个组,接下来会添加summary变量到示例报表中. 一.对summary添加变量 对于提供的数量和总量来说,变量是特殊的数值项,它们每 ...
- Java 把 InputStream 转换成 String 的几种方法
我们在 Java 中经常会碰到如何把 InputStream 转换成 String 的情形,比如从文件或网络得到一个 InputStream,需要转换成字符串输出或赋给别的变量. 未真正关注这个问题之 ...
- 基于layerpage 前后端异步分页
#下载jquery 和 layerpage1.核心分页方法 laypage({ cont: 'page1', //容器.值支持id名.原生dom对象,jquery对象. pages: json.tot ...
- Css样式基础
1.Css的语法 CSS的语法主要由两个部分组成,一个是选择器,一个是属性. 选择器又分为以下几种: 1.元素选择器:即Html标签去掉括号的就是元素 2.类选择器:所谓的类就是说class=“名称” ...
- [转]Part2: Understanding !PTE, Part2: Flags and Large Pages
http://blogs.msdn.com/b/ntdebugging/archive/2010/04/14/understanding-pte-part2-flags-and-large-pages ...
- javaScript AJAX
AJAX的实现 var sAjax = function () { var sendMsg = { url: "", sendType: "POST", Con ...
- Hadoop 简介
一个开源的,高可靠,可扩展的分布式计算框架 解决的问题 1 海量数据的存储(HDFS) 2海量数据的分析(Mapreduce) 3 分布式资源调度 (Yarn) 应用场景 日志分析,基于海量数据的在线 ...