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】程序、进程和线程的区别
程序.进程和线程的区别 程序是一组指令及参数的集合,指令按照既定的逻辑控制计算机运行.进程则是运行着的程序,是操作系统执行的基本单位.线程则是为了节省资源而可以在同一个进程中共享资源的一个执行单位. ...
随机推荐
- cmd光标移动
ESC:清除当前命令行.F1: 单字符输出上次输入的命令 相当于方向键上的 → 的作用.F2: 可复制字符数量 , 输入上次命令中含有的字符,系统自动删除此字符后的内容.F3: 重新输入前一次输入的命 ...
- 为什么这些java接口没有抽象方法?浅谈Java标记接口
在jdk的源码中,存在这样的一些接口,他们不包含任何的(抽象)方法,但是却广泛的存在. 这种接口我们称之为Mark Interface,也就是标记接口. 这些接口呢,我们不用来实现任何的方法,他们的作 ...
- 论文阅读(Xiang Bai——【TIP2014】A Unified Framework for Multi-Oriented Text Detection and Recognition)
Xiang Bai--[TIP2014]A Unified Framework for Multi-Oriented Text Detection and Recognition 目录 作者和相关链接 ...
- css中子元素浮动,无法自动撑开父元素的解决办法
<div> <div style="float:left;">left</div> <div style="float:righ ...
- 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数014,tuple,元组
<zw版·Halcon-delphi系列原创教程> Halcon分类函数014,tuple,元组 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“p ...
- struts2漏洞与修复
步骤: 1.下载struts-2.3.16.3-all, D:\TEST\struts2.3.16.3 2.替换jar,参考 http://blog.csdn.net/spyjava/article/ ...
- ToolTipController 事件触发显示时 避免闪烁的处理方法
private DevExpress.Utils.ToolTipController toolTipController1; private DevExpress.Utils.ToolTipContr ...
- C++术语俗解
C++作为一种复杂的编程语言,其最晦涩的莫过于各个术语. 以下就经常使用的术语,逐个俗解(特别声明:为了对术语的更好理解与记忆,仅代表个人的俗识,若有不妥之处望给予指正),分享共勉. 内存:一片计算机 ...
- Makefile使用库
这篇文章演示了Makefile使用mysqlpp库和lua库的写法. test.cpp: #include <iostream> #include <stdint.h> #in ...
- 我的Android第三章
先看效果图. 点击之后出变成 按钮内容改变了,并且弹出一个小提示 下面我们就来看看如何实现这个小案例 1)先打开string.xml文件,把要定义的字符串资源放置在里面 2)然后我们要画页面,基本An ...