Linux系统编程——进程间通信

1.进程间通信(IPC)概述

        Linux系统编程——进程间通信_第1张图片

 

 2.管道通信原理

        2.1特点

Linux系统编程——进程间通信_第2张图片

 管道中的数据读走就没了

        2.2原型

Linux系统编程——进程间通信_第3张图片Linux系统编程——进程间通信_第4张图片

 Demo

Linux系统编程——进程间通信_第5张图片        

3.无名管道

        3.1 pipe函数

                3.1.1参数说明

                        

                         pipefd:存在两个元素的整型数组

                3.1.2返回值

                        成功:0

                        失败:-1

Demo

Linux系统编程——进程间通信_第6张图片

 3.创建命名管道(FIFO )

        3.1特点

Linux系统编程——进程间通信_第7张图片

        3.2 mkfifo函数

        Linux系统编程——进程间通信_第8张图片

                3.2.1参数说明

                        pathname:创建管道的路径名

                        mode:创建命名管道的类型(同open中的mode——0600)

                3.2.2返回值

                        成功:0

                        失败:-1

Demo Linux系统编程——进程间通信_第9张图片

 4.命名管道的数据通信编程实现

        4.1读操作

Demo

Linux系统编程——进程间通信_第10张图片

         4.2写操作

Demo

Linux系统编程——进程间通信_第11张图片

 5.消息队列

        5.1特点

Linux系统编程——进程间通信_第12张图片

Linux系统编程——进程间通信_第13张图片

        5.2消息队列相关API

Linux系统编程——进程间通信_第14张图片

6.消息队列编程收发数据

        6.1 msgget函数

                6.1.1参数说明

                

Linux系统编程——进程间通信_第15张图片

                6.1.2返回值

                        成功:msgid

                        失败:-1

Demo

Linux系统编程——进程间通信_第16张图片

        6.2 msgrcv函数

                6.2.1参数说明

                msgid: msgget的返回值

                msgp:

先构建一个结构体,msgbuf,定义一个结构体变量,取该变量地址为参数

Linux系统编程——进程间通信_第17张图片

                msgsz:消息的大小,用sizeof(结构体变量.mtext即可)

                msgtyp:

Linux系统编程——进程间通信_第18张图片

                 msgflg:一般为0

Demo

                6.2.2返回值

                        成功:为读取的实际字节数

                        失败:-1

        6.3 msgsnd函数

                6.3.1参数说明

                       msqid:msgget的返回值

                       msgp:要发送的结构体

                       msgsz:要发送的大小

                       msgflg:一般为0

                6.3.2返回值

                        成功:0

                        失败:-1

读操作

Linux系统编程——进程间通信_第19张图片

写操作:

Linux系统编程——进程间通信_第20张图片

 7.键值生成以及消息队列移除

        7.1键值生成

                7.1.1 ftok函数

                        7.1.1.1参数说明 

                fname:一般用当前目录

                id:一般用小的整型数

                        7.1.1.2返回值

                                成功:key

                                失败:-1

Demo

        

        7.2消息队列移除

        一般做法:

       

8.共享内存概述

AB进程同时能够读取到同一块内存空间

Linux系统编程——进程间通信_第21张图片

 操作方法:1.创建/打开共享内存

                   2.映射

                   3.数据交互

                   4.释放共享内存

                   5.干掉

相关API

Linux系统编程——进程间通信_第22张图片

 9.共享内存编程实现

Linux系统编程——进程间通信_第23张图片

 写操作

Linux系统编程——进程间通信_第24张图片

读操作

Linux系统编程——进程间通信_第25张图片

10.信号概述

Linux系统编程——进程间通信_第26张图片

                  Linux系统编程——进程间通信_第27张图片

11.信号编程

        11.1信号处理函数的注册

Linux系统编程——进程间通信_第28张图片

                11.1.1signal函数 

                        11.1.1.1参数说明

                                signum参考信号表,如ctrl c为2,kill为9

                                handler:信号处理函数(定义一个返回值为void,参数为int类型的函数)

Demo

Linux系统编程——进程间通信_第29张图片

        11.2信号处理发送函数

Linux系统编程——进程间通信_第30张图片

                 11.2.1 kill函数

                 

                pid:进程id

                signum:signum参考信号表,如ctrl c为2,kill为9

Demo

Linux系统编程——进程间通信_第31张图片

Linux系统编程——进程间通信_第32张图片

        11.3信号忽略的宏SIG_IGN

Demo

Linux系统编程——进程间通信_第33张图片

12.信号如何携带信息

        12.1 sigaction函数原型

                12.1.1参数说明

                        12.1.1.1 signum信号值

                        12.1.1.2 act

 sigaction结构体

Linux系统编程——进程间通信_第34张图片                        sa_handler函数指针:同signal中的handler函数指针

                        sa_sigaction函数指针:

                                     int:signum

                                     siginfo_t 结构体

Linux系统编程——进程间通信_第35张图片

                                     eg:si_pid谁发的

                                             si_int发送整型数

                                             si_value联合体,int,char*

Linux系统编程——进程间通信_第36张图片

                                sa_mask:默认值为阻塞

                                sa_flgs:SA_SIGINFO表示能接收数据

                                void* :当指针为空时无数据                

                                          当指针非空时有数据

                        12.1.1.3 oldact:类比act

Demo

Linux系统编程——进程间通信_第37张图片

        12.2信号发送函数高级版——sigqueue

                12.2.1函数原型Linux系统编程——进程间通信_第38张图片

                         12.2.1.1参数说明

                                pid:发给谁(哪个线程)

                                sig:发送什么信号

                                value:消息

Linux系统编程——进程间通信_第39张图片

sendDemo

 Linux系统编程——进程间通信_第40张图片

 13.信号量概述

        13.1特点

Linux系统编程——进程间通信_第41张图片

Linux系统编程——进程间通信_第42张图片

         13.2临界资源

Linux系统编程——进程间通信_第43张图片

         13.3 API原型

Linux系统编程——进程间通信_第44张图片

                 13.3.1 semget函数

                 

                        13.3.1.1参数说明

                                key:由ftok返回

                                num_sems:信号量集中信号量的个数

                                sem_flags:一般为IPC_CREAT|0666

                        13.3.1.2返回值

                                成功:信号集id

                                失败:-1

Demo

Linux系统编程——进程间通信_第45张图片 

                13.3.2 semctl函数                           

     ​​​​​​​         

                        13.3.2.1参数说明

                                semid:semget的返回值

                                semnum:第几个信号量

                                cmd:指令,一般初始化为SETVAL,销毁时为IPC_RMID

                                第四个参数:先定义一个共用体,并初始化结构体变量中的val为1

        ​​​​​​​​​​​​​​         Linux系统编程——进程间通信_第46张图片

Demo

Linux系统编程——进程间通信_第47张图片

                13.3.3semop函数

        ​​​​​​​        

                semid:semget的返回值

                sops:结构体数组

                nsops:数组元素的个数

         13.4 pv操作

                13.4.1 p操作

Linux系统编程——进程间通信_第48张图片

                13.4.2 v操作

Linux系统编程——进程间通信_第49张图片

Demo

Linux系统编程——进程间通信_第50张图片

 Linux系统编程——进程完结

 

 

                                                   

               

                        

                        

   

你可能感兴趣的:(linux)