进程之间的通信:
1.文件
2.信号
3.管道
4.共享内存
5.消息队列 重点
6.信号量集
7.网络 重点
4,5,6 统称为XSI IPC通信方式
********管道实现进程之间的通信********
管道:本质上还是以文件作为媒介,只是该文件比较特殊,叫做管道文件而已;
分为两大类:
有名管道:可以用于任意两个进程之间的通信
无名管道:主要用于父子进程之间的通信
有名管道时间进程之间的通信:
mkfifo a.pipe:创建管道文件
#include
#include
int mkfifo(const char *pathname, mode_t mode/*权限 如0664*/);
函数功能:用于创建参数指定的有名管道文件
********使用共享内存实现进程之间的通信********
共享内存:本质上是一块由系统内核维护的内存空间,该内存空间被共享在两个进程之间;
从而通过读写实现通信;
通信模型:
1.获取key值,使用ftok函数;
2.创建共享内存,使用shmget函数;
3.挂接共享内存,使用shmat函数;
4.访问共享内存;
5.脱接共享内存,使用shmdt函数;
6.如果不再使用,则删除共享内存,使用shmctl函数;
#include
#include
key_t ftok(const char *pathname, int proj_id);
第一个参数:字符串形式的路径名; 必须存在并且可以访问
第二个参数:项目编号;必须是非0 取底八位二进制位
返回值:成功返回key_t类型的key值,失败返回-1;
函数功能:主要用于根据路径名和项目编号来生成key值
****注意****
使用相同的文件路径和项目编号时,生成的key值也相同;
#include
#include
int shmget(key_t key, size_t size, int shmflg);
第一个参数:
第二个参数:共享内存的大小
第三个参数:具体的操作标志
IPC_CREAT:若不存在则创建,存在则打开
IPC_EXCL:与PIC_CREAT搭配使用,若存在则创建失败
0:获取已经存在的共享内存
返回值:
函数功能:创建/获取一个共享内存
****注意****
当前创建新的共享内存时,需要在第三个参数中通过按位或的方式来指定权限信息;
********使用信号量集实现进程之间的通信********
信号量的基本概念:
本质上是一个计数器,用于控制同时访问同一种共享资源的进程/线程个数
信号量的工作方式:
1.首先初始化信号量为最大值
2.当有进程申请共享资源时,信号量的数值减1;
3.当信号量的数值为0时,申请共享资源的进程进入阻塞状态;
4.当有进程释放共享资源时,信号量的数值加1;
5.只要信号量的数值>0,则阻塞的进程可以继续抢占资源,抢不到的进程继续阻塞;
什么是信号量集:
本质上就是若干个信号量组成的集合;用于控制多种共享资源分别被同时访问的进程/线程个数
通信模型:
1.获取key值,使用ftok函数;
2.创建/获取信号量集,使用semget函数;
3.初始化/操作信号量集,使用semctl/semop函数;
4.如果不再使用,则删除信号量集,使用semctl函数;、
相关函数的解析:
#include
#include
#include
int semget(key_t key, int nsems, int semflg);
第一个参数:key值ftok函数的返回值
第二个参数:信号量集的大小,也就是信号量的个数;0 - 获取已经存在的信号量集
第三个参数:具体的操作标志
IPC_CREAT 若存在则打开,若不存在则创建
IPC_EXCL 和IPC_CREAT搭配使用,若存在则创建失败
0 - 获取已经存在的信号量集
返回值:成功返回信号量集,失败返回-1;
函数功能:主要用于创建/获取信号量集;
注意:当创建新的型号量集时,需要在第三个参数中通过按位或的方式指定权限信息;
#include
#include
#include
int semctl(int semid, int semnum, int cmd, ...);
第一个参数:信号量集的ID,semget函数的返回值
第二个参数:信号量集的下标,从0开始
第三个参数:具体的操作命令
IPC_RMID 删除信号量集,忽略第二个参数,不需要第四个参数;
SETVAL 使用第四个实参给下标为semnum的信号量初始化
第四个参数:可变长参数,是否需要取决于cmd
返回值:成功返回信号量集,失败返回-1;
函数功能:主要用于控制参数指定的信号量集;
#include
#include
#include
int semop(int semid, struct sembuf *sops, unsigned nsops);
第一个参数:型号量集的ID,semget函数的返回值;
第二个参数:结构体指针,可以指向结构体变量,也可以指向结构体数组;
第三个参数:结构体变量的个数;
当第二个参数指向结构体变量时,该参数的数值为1;
当第二个参数指向结构体数组时,该参数为数组元素个数;
主要功能:主要用于操作指定的信号量集
struct sembuf sops[2];
sops[0].sem_num = 0; /* 信号量集的下标*/
sops[0].sem_op = 0; /* >0:增加 <0:减少 =0 不变 */
sops[1].sem_flg = 0; /* 操作标志,默认0*/