#2019年ipc知识点回顾
####首先我们要注意的是ipc对象的可持续性
随进程的持续性:
```
管道、FIFO、posix互斥锁、posix条件变量、posix读写锁、fcntl记录上锁、posix基于内存的信号量、tcp、udp以及域套接字
```
随内核的持续性
```
消息队列,共享内存,信号量
```
####fork exec exit对ipc产生的影响
这一点书中有描写我们要格外注意,
见:
https://blog.csdn.net/ctthuangcheng/article/details/9334359
####systemv消息有一个共性,要使用ftok创建一个key_t键
IPC_PRIVATE可以申请一个唯一的key_t
####管道和FIFO
管道的三种管道:
1.无名管道
pipe只能在有血缘关系的进程之间使用
注意PIPE_BUF之内的请求才会保证原子性
2.popen和pclose
popen打开程序并且取得返回结果
3.fifo
mkfifo可以用在没有学院关系的进程之间通讯。
4.fcntl可以设置套接字阻塞模式,以及读写等其他额外属性
long mq_maxms long mq_maxmsg; //队列中包含的消息数的最大限制数 long mq_msgsize; //每个消息大小的最大限制数 long mq_maxmsg; //队列中包含的消息数的最大限制数 long mq_msgsize; //每个消息大小的最大限制数g; //队列中包含的消息数的最大限制数 long mq_msgsize; //每个消息大小的最大限制数
####posix消息队列
常用的posix消息队列的操作函数:
mq_open和mq_close 和mq_unlink
我们要清楚mq_close和mq_unlink的区别,由于消息队列是随内核持续影响的,所以我们使用mq_close知识在进程中关闭并没有在内核中删除我们要使用mq_unlink删除掉他。
我们可以使用mq_getattr和mq_setattr返回所有的这些属性,mq_setattr可以设置的属性
```
struct mq_attr{
long mq_flags;//阻塞位置
long mq_maxmsg;//最大个数
long mq_msgsize;//最大消息尺寸
long curmsgs;//当前队列消息数
}
```
可以使用mq_send和mq_receive来收发数据,我们mq_receive之前一定要getattr获取最大长度再分配区域去接收,系统级别的可以用setconfig去获得参数
mq_notify
当队里里出现数据的时候触发信号,我们使用signal要注意函数的安全性。还有信号我们要注意实时信号和非实时信号这个概念。
####systemv消息队列
msgget函数用于创建
和msgsnd函数用于发送
msgrcv函数可以用来接收
msgctl可以删除内核中的消息队列以及设置属性
####互斥锁
互斥锁的创建 以及销毁
pthread_mutex_init 初始化动态锁
静态所使用pthread_mutex mutex=PTHREAD_MUTEX_INITIALIZER
pthread_mutex_lock创建所
pthread_mutex_unlock解锁
pthread_mutexattr_init初始化
pthread_mutexattr_destroy销毁属性
pthread_mutexattr_setpshared设置共享锁
pthread_mutexattr_setpshared 过去共享锁
pthread_cond_init初始化
pthread_cond_destroy销毁
pthread_cond_signal发送信号解锁
pthread_condattr_setpshared 设置条件变量共享属性
pthread_condattr_getpshared 获取条件变量共享属性