linux应用程序设计基础--进程间通信(IPC)
来源:互联网 发布:java gui轻量级框架 编辑:程序博客网 时间:2024/05/16 07:27
theme:进程间通信(IPC)
author:Jeff.Xue
contact information:contactmexkj@163.com
1.进程间通信作用
- 数据传输
- 资源共享
- 通知事件
- 进程控制
2.通信方式:
- 管道pipe/FIFO
- 信号signal
- 消息队列
- 共享内存
- 信号量
- 套接字
3.管道通信
(1)管道:单向、先进先出
(2)管道种类
- 无名管道:父子进程通信
- 有名管道:任意进程通信
(3)无名管道
- int pipe(int filedis[2]);//filedis[0]用于读管道,filedis[1]用于写管道
- 关闭管道:将2个文件描述符关闭
- pipe() -> fork() 先pipe再fork,子进程继承文件描述符
(4)命名管道(FIFO):不相干进程交换信息
- int mkfifo(const char *pathname,mode_t mode);//O_NONBLOCK(非阻塞标志)
4.信号通信
(1)30种信号类型:常见:SIGINT(中断),SIGKILL(KILL命令发出的信号)
(2)处理方式:
- 忽略此信号(SIGKILL,SIGSTOP不能忽略)
- 执行希望动作
- 执行默认动作
(3)信号发送:kill/raise
- int kill(pid_t pid,int signo);//KILL可以向自身发送信号,可以向其他发送信号(#include <sys/type.h> #include <signal.h>)
- int raise(int signo);//向进程自身发送信号
(4)alarm设置一个时间值产生sigalarm信号,默认动作终止该进程(一个进程只能有一个)
#include <unistd.h>unsigned int alarm(unsigned int seconds);
(5)pause 使进程挂起知道捕捉一个信号
int pause(void);
(6)主要处理
- 使用简单的signal函数
void ( *signal (int signo, void (*func)(int)))(int)//func 可以分为:SIG_ING:忽略 / SIG_DFL:默认处理 / 信号处理函数名
- 使用信号集处理函数
5.共享内存:被多个进程共享的一部分物理内存(特点:快)
STEP:
- 创建共享内存:shmget
- 映射共享内存:映射到具体的进程空间shmat
(1)int shmget(key_t key,int size,int shmflg);
- key 标识共享内存键值:0/IPC_PRIVATE
- key=IPC_PRIVATE:创建一块新的共享内存
- key=0&&shmflg=IPC_PRIVATE:同样创建新的共享内存
- 返回内存标识符
(2)int shmat(int shmid,char *shmaddr,int flag);
- shmid:标识符
- flag:以什么方式确定地址
- 成功返回共享内存映射到进程的地址
(3)脱离映射:int shmdt(char *shmaddr);
6.消息队列
(1)信号能传送的信号量有限,管道只能传送无格式的字节流
(2)消息队列:消息链表,具有特定的格式(读完则清除)
- POSIX消息队列 //POSIX:可移植操作系统接口
- 系统V消息队列 //随内核持续
(3)消息队列的内核持续性要求每个消息队列有唯一的键值
#include <sys/type.h>#include <sys/ipc.h>key_t ftok(char *pathname,char proj);//返回键值int msgget(key_t key,int msgflg);//返回消息队列描述字/*msgflg:IPC_CREAT:创建新的队列IPC_EXCL:若已经存在,返回errorIPC_NOWAIT:不阻塞key为 IPC_PRIVATE也可创建*///向消息队列发送消息int msgsnd(int msqid,struct msgbuf *msgp,int msgsz,int msgflg);/*struct msgbuf{long mtype;//消息类型char mtext[];//消息数据首地址}*///接收消息int msgrcv(int msqid,struct msgbuf *msgp,int msgsz,long msgtype,int msgflg);//成功读取后,队列中消息则被删除
7.信号量
(1)主要用途:保护临界资源(根据其判断是否访问资源)/进程同步
(2)分类
- 二值信号量:0/1
- 计数信号量:任意非负值
(3)创建/打开
- int semget(key_t key,int nsems,int semflg);//nsems为信号灯集内信号灯数量
(4)操作
- int semop(int semid,struct sembuf *sops,unsiged nsops);//*sops 为操作数组,nsops为sops所指向数组个数
struct sembuf{ unsigned short sem_num;//index in array short sem_op;//operation short sem_flg;//flags}
- linux应用程序设计基础--进程间通信(IPC)
- Linux进程间通信(IPC)--
- linux进程间通信(IPC)
- Linux进程间通信(IPC)
- Linux进程间通信(IPC)
- Linux进程间通信(IPC)
- Linux进程间通信(IPC)
- Linux 进程间通信(IPC)
- Linux进程间通信(IPC)
- linux 进程间通信简介(IPC)
- Linux进程间通信(IPC)
- linux-sys_进程间通信(IPC)
- [进程通信] Linux进程间通信(IPC)
- Linux进程间通信(IPC)
- Linux 进程间【IPC】通信
- Linux 进程间通信(IPC)
- Linux进程间通信 IPC
- linux ipc 进程间通信
- document.createElement()的用法
- cmake 常用内容
- c++/MFC 极为简单的socket实例
- 设计模式--创建型--原型模式
- 输出10000所有的素数
- linux应用程序设计基础--进程间通信(IPC)
- Linux设备驱动之I2C架构分析
- expdp的使用方式
- 通过LDAP在AD域控上进行添加、删除、修改、查询等各种操作
- 关于application/x-www-form-urlencoded等字符编码的解释说明
- 一个纠结的c++动态创建二维数组不能用的问题
- “Oracle.DataAccess.Client.OracleConnection”的类型初始值设定项引发异常
- Rails代码质量控制工具
- FLEX动画效果