进程间通信(IPC)学习
原创
©著作权归作者所有:来自51CTO博客作者name_110的原创作品,请联系作者获取转载授权,否则将追究法律责任
1、Linux进程间通信方法:信号、管道与命名管道、消息队列共享主存、信号量、套接字
3、信号通信
3.1、在Linux环境下,可通过运行“kill -l”命令获得Linux支持的信号列表
3.2、信号生命周期:信号诞生、信号在进程中注册、信号在进程中注销、信号处理函数执行完毕
3.3、信号处理函数
a)、信号安装函数:#clude<signal.h>,主要有signal()和sigaction()函数
b)、信号发送函数:最常用的5个发送信号的函数是:kill(),raise(),alarm(),settimer(),pause(),需包含头文件<signal.h>和<sys/types.h>
c)、信号操作函数:
int sigemptyset(sigset-t *set); //信号集合清空
int sigfillset(sigset_t *set); //设置包含所有信号的全集
int sigaddset(sigset_t *set, int signo); //把一个信号加入信号集合
int sigdelset(sigset_t *set, int signo); //把一个信号从集合里删除
int sigismember(const sigset_t *set, int signo); //判断信号是否包含在给定集合中
int sigprocmask(int how, const sigset_t *set, sigset_t *oset); //设置进程中断屏蔽码
how = [SIG_BLOCK, SIG_UNBLOCK, SIG_SETMASK], *oset对设置前屏蔽码做备份
4、管道通信:
4.1、概述:管道是通过内核缓冲区按先进形象地先出的方式传输数据,对于管道,可以当作是连接两个命令或应用程序的一个单向连接器。
4.1、管道通信分为匿名管道(pipe)和命名管道(FIFO)。
4.2、匿名管道局限性:a、只支持单向数据流;b、只能用于具有亲缘关系的进程;c、没有名字;d、缓冲区有限,大小为一个页面。 #include<unistd.h> int pipe(int fd[2])
4.3、命名管道:#include<sys/types.h> #include<sys/stat.h> int mkfifo(const char* pathname, mode_t mode)
5、消息队列
5.1、消息队列基本原理:
子进程child发送首次登记的标志FLAG(msgtyp>0)和child进程号到服务器进程server注册,在server段使用msgrcv(Q_MSG_KEY, &recv_buf, sizeof(Message)-sizeof(long), FLAG, 0)接收,Message正文不包括消息头的标志。然后server端发送server进程号,接收消息标志为子进程号的Message到子进程表示接收到先前消息。
消息队列通过消息标志(即进程号)进行通信,如果客户/服务端进程有任何一方退出,则可能会出现消息丢失。即把退出一方的进程号作为标志的消息不会被任何进程接收,因为其他的进程号和消息标志不匹配。
一般过程:
建立连接开始数据通信
回复反馈信息
发送注册信息
Server
Client
消息队列通信
5.2、消息队列基本操作:
这些操作包含在以下3个头文件中:#include<sys/types.h> #include<sys/ipc.h> #include<sys/msg.h>
a)、打开或创建一个消息队列:int msgget(key_t key, int flag)
b)、读写操作:int msgsnd(int msqid, void *msgp, size_t msgsz, int msgflg));
int msgrcv(int msqid, void *msgp, size_t msgsz, long int msgtyp, int msgflg)); //接收消息
c)、消息队列属性操作:int msgctl(int msqid, int cmd, struct msqid_ds *buf);
6、信号量
6.1、信号量基本操作:
必须包含以下3个头文件:#include<sys/types.h> #include<sys/ipc.h> #include<sys/sem.h>
a)、打开或创建信号量: int semget(key_t key, int nsems, int flag);
b)、信号量值操作: int semop(int semid, struct sembuf *sops, unsigned nsops);可以用于增加或减小信号量值。
c)、信号量属性操作:int semctl(int sem_id, int semnum, int cmd);
7、共享主存
7.1、概述:共享内存就是多个进程共享一端物理内存空间,通过把一段物理内存地址映射不同的虚空间来实现,而消息队列是把数据从应用缓冲区到核心缓冲区往返复制。因此共享内存的通信使用效率比消息队列高,但存在复杂的同步互斥关系。
7.2、基本操作:
int shmget((key_t key, int size, int shmflg)); //创建或取得一块共享内存
int shmctl((int shmid, int cmd, struct shmid_ds *buf)); //共享内存操作
void *shmat((int shmid, const void *shmaddr, int shmflg)); //获取共享内存的指针
int shmdt((const void *shmaddr)); //将共享内存块从进程中分离/删除
上一篇:实例学习进程线程编程
下一篇:实例学习Linux进程通信(一)
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
Linux进程间通信
进程间通信方式,命名管道,共享内存。
共享内存 管道文件 -
Android IPC 进程间通信
IPC (进程间通信)本文转
线程 通信 IPC 进程通信 序列化 -
进程间通信(IPC)—管道
进程间通信的方式
进程间通信 管道 -
安卓进程间通信(ipc)
这几天面试,准备了一下ipc进程间通信,顺带着,总结了一下se
aidl 服务端 客户端 ide -
Qt 之进程间通信(IPC)
简述进程间通信,就是在不同进程之间传播或交换信息。那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的
Qt Qt进程通信 Qt共享内存 Qt-IPC Qt通信 -
进程间通信(IPC 工具介绍)
进程间通信、IPC 工具比较
IPC 进程间通信 文件描述符 共享内存 数据 -
进程间通信(IPC)—信号(2)
进程间通信之信号
进程间通信 信号 常规信号 信号捕捉 -
Linux 进程间通信(IPC)
Linux 进程间通信(IPC): Linux系统中除了进程和进程之间通信,我想大家也应该关注用户空间与内
#include 进程间通信 unix 内核空间 用户空间