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));                                   //将共享内存块从进程中分离/删除

转载于:https://blog.51cto.com/name110/616895

进程间通信(IPC)学习相关推荐

  1. 几种常见的IPC(进程间通信)学习笔记

    几种常见的IPC(进程间通信)学习笔记 我们知道进程是资源分配的最小单位,而线程是资源调度的最小单位.我们涉及比较多的通常是多线程开发,因为现在的程序要处理复杂的任务,往往需要多线程,确保主线程不会因 ...

  2. Linux系统编程学习笔记(九)进程间通信IPC

    进程间通信IPC: 我们以前介绍过进程控制原语,看到怎么创建多个进程.但是进程之间交互信息的方式只介绍了通过fork或者exec继承父进程的打开文件或者通过文件系统. 经典的进程通信方式有:管道.FI ...

  3. 详解操作系统之进程间通信 IPC (InterProcess Communication)

    进程间通信(IPC,Inter-Process Communication),指至少两个进程或线程间传送数据或信号的一些技术或方法. 进程是计算机系统分配资源的最小单位(严格说来是线程).每个进程都有 ...

  4. Android中进程间通信(IPC)方式总结

    IPC为进程间通信或跨进程通信,是指两个进程进行进程间通信的过程.在PC和移动设备上一个进程指的是一个程序或者一个应用,所以我们可以将进程间通信简单理解为不同应用之间的通信,当然这种说法并不严谨. 在 ...

  5. Linux进程+进程间通信IPC

    一 Linux进程 1) 进程的内存映像 2)解释 BSS段:在采用段式内存管理的架构中,BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Bloc ...

  6. 进程间通信 IPC、LPC、RPC

    原文请见:进程间通信IPC.LPC.RPC 进程间通信(IPC,Inter-Process Communication),指至少两个进程或线程间传送数据或信号的一些技术或方法.进程是计算机系统分配资源 ...

  7. 漫谈QNX(架构/进程,线程,同步,进程间通信IPC)

    (1)架构 说起Blackberry的QNX操作系统, 想必大家都听说过,但到底为什么QNX能如此有名?难道微软的Windows和Linux都不能与之抗衡? 美国NASA的太空接驳飞船也使用QNX操作 ...

  8. linux:进程间通信 IPC

    文章目录 1.管道 1.1.匿名管道 1.2.有名管道 2.信号 3.共享内存 3.1.共享内存接口 3.1.1.生成 key 值 3.1.2.创建共享内存 3.1.3.创建共享内存映射 3.1.4. ...

  9. linux进程间通信 ipc,进程间通信IPC (InterProcess Communication)

    一.进程间通信的概念 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区, ...

最新文章

  1. FMS应用实例 - 从FMS服务器读取文件(图片/SWF/文本)到客户端
  2. MyBatis的架构和其运行流程
  3. OpenCV钻石Diamond 标记的检测
  4. python3 shutil模块
  5. hive if语句_Hive实践(高阶篇)
  6. Gamma Correction
  7. C++ STL 遍历vector
  8. jmeter 压力测试教程全解
  9. vant在cell中加表格_在vant 中使用cell组件 定义图标该图片和位置操作
  10. 10 LVS负载均衡群集-NAT
  11. 解决:关于启动Kafka一段时间后,进程自己停止运行的问题
  12. BDA,CDA,CPDA哪个证相对可靠?哪个含金量高?具体考试内容?
  13. linux--封装redhat镜像
  14. 使用javah 生成.h头文件
  15. DSP方案山景AP8224C2芯片可烧录适用USB声卡降噪麦克风
  16. WAS6.1JNDI数据源配置测试代码
  17. 《Python数据分析与挖掘实战》Chapter8中医证型关联规则挖掘笔记
  18. 读书笔记---阶级逆袭——三代人的卵巢彩票
  19. MPS与MRP的区别
  20. FrameLayout, LinearLayout, ReativeLayout怎么做到View在右下

热门文章

  1. 冲刺第四天 1.4 FRI
  2. 大佬带你深入浅出Lua虚拟机
  3. 如何水平居中一个元素
  4. 【Android必备】与其他碎片进行通信(10)
  5. openstack虚拟机内文件遭破坏的急救方案
  6. 杨光:物联网连接将成为虚商发展新空间
  7. ActiveMQ学习笔记(8)——导入ActiveMQ源码到Eclipse
  8. 关于ASP.NET MVC P5中CheckBox的HtmlHelper方法的bug。
  9. Biztalk 2006 adapter的开发比2004容易的多
  10. (四) prometheus + grafana + alertmanager 配置Kafka监控