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】程序、进程和线程的区别
程序.进程和线程的区别 程序是一组指令及参数的集合,指令按照既定的逻辑控制计算机运行.进程则是运行着的程序,是操作系统执行的基本单位.线程则是为了节省资源而可以在同一个进程中共享资源的一个执行单位. ...
随机推荐
- uva 147 Dollars
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- Android 多媒体视频播放一( 多媒体理解与经验分享)
前言 说到android的多媒体,一把辛酸一把泪,当初听说会多媒体的比较牛掰,公司也有需求,于是乎我也积极的加入研究android多媒体的行列,记得以前刚接触的时候,最开始还是比较头大的,主要是但是很 ...
- Life Cycle of Thread – Understanding Thread States in Java
Life Cycle of Thread – Understanding Thread States in Java 深入理解java线程生命周期. Understanding Life Cycle ...
- 。。。IO流学习之二。。。
fileReader的用法: import static org.junit.Assert.*; import java.io.File; import java.io.FileNotFoundExc ...
- zzuli-小火山的跳子游戏
Description 小火山和火山火山在一块玩跳子游戏.规则如下: 1:跳子的起始位置为0,棋盘大小从1到N 2:每次跳子跳k步. 例如当前位置为i, 那么下一步为i + k 3:跳 ...
- 安装hive+mysql
1.源码安装mysql 以root用户首先安装libaio-0.3.104.tar.gz tar zxvf libaio-0.3.104.tar.gz cd libaio-0.3.104 make p ...
- 【MongoDB for Java】Java操作MongoDB
上一篇文章: http://www.cnblogs.com/hoojo/archive/2011/06/01/2066426.html介绍到了在MongoDB的控制台完成MongoDB的数据操作,通过 ...
- c#中按键小技巧
以后会补充其他的内容
- XEN的启动信息输出到“Platform timer is 14.318MHz HPET”就暂停接收的解决办法
使用Serial Over Lan(SOL)来双机调试 XEN,在 XEN 启动时,引导信息输出到以下这一句时,就不再发送调试信息了: ...(XEN) Intel machine check rep ...
- IT girl
听着柔和的音乐,敲着自己喜欢的代码......