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】程序、进程和线程的区别
程序.进程和线程的区别 程序是一组指令及参数的集合,指令按照既定的逻辑控制计算机运行.进程则是运行着的程序,是操作系统执行的基本单位.线程则是为了节省资源而可以在同一个进程中共享资源的一个执行单位. ...
随机推荐
- [总结] JDBC数据库操作
1.加载驱动--告诉驱动管理将使用哪一个数据库的驱动包. class.forName("com.mysql.jdbc.Driver"); 2.操作JDBC ADI完成数据库动作 D ...
- C# (灰度)加权平均法将图片转换为灰度图
private Bitmap ToG(string file) { using (Bitmap o = new Bitmap(file)) { Bitmap g = new Bitmap(o.Widt ...
- [转]初探Metasploit的自动攻击
1. 科普Metasploit 以前只是个Back Track操作系统(简称:BT) 下的攻击框架,自成继承了后攻击渗透模块,隐隐有成为攻击平台的趋势. 我们都戏称它为美少妇,很简单,msf. 它 ...
- 关于Java内存模型的解读
运行时数据区域 运行时数据区包括以下五大部分:方法区.堆.虚拟机栈.本地方法栈.程序计数器.其中,方法区和堆是由所有线程共享的数据区,其他区域是线程隔离的数据区. 程序计数器: 程序计数器是一块较小的 ...
- font-family styles
以下是几种常用字体的字形样式预览: 步骤阅读
- Java类的基本运行顺序是怎样
我们以下面的类来说明一个基本的 Java 类的运行顺序: public class Demo{ private String name; private int age; public Demo(){ ...
- 自定义子tabBar
基本设置 设置APPIcon(直接拖图片) 设置启动图片 将launch Screen File里的LaunchScreen.xib给删掉 点击launch image source框内的Use As ...
- java第六次作业
一个抽奖程序:用ArrayList类和random类 import java.awt.*; import javax.swing.*; import java.awt.event.; import j ...
- Vuejs——(2)Vue生命周期,数据,手动挂载,指令,过滤器
(八)传入的数据绑定 先创建一个对象(假如是obj),然后将他传入Vue实例中,作为data属性的值,那么 ①obj的值的变化,将影响Vue实例中的值的变化: ②相反一样: ③可以在Vue实例外面操纵 ...
- Unable to make the session state request to the session state server处理
Server Error in '/' Application. Unable to make the session state request to the session state serve ...