IPC:interprocesscommunication 进程间通信。
ipc对象的持续性:
随进程持续:管道、互斥锁、条件变量、读写锁、fcntl记录上锁、套接字、posix基于内存的信号量
随内核持续:消息队列、信号量(posix有名信号量和system v信号量)、共享内存
在CS架构中,迭代服务器可能出现拒绝服务型攻击(DoS),所以要注意可能在哪里阻塞和阻塞多久。
解决DoS攻击的方法:
1.在迭代服务器中的阻塞设置超时时间。
2.使用并行服务器。
生产者消费者问题最好的解决方法就是IPC,避免产生死锁;
生产者往缓冲区放数据,消费者使用这些数据。
----------------------
IPC的3种技术:
进程(线程)间传递消息的6种接口:
1.管道
2.消息队列
3.过程调用
进程(线程)间同步的6种接口:
1.信号量(两种)
2.互斥量
3.条件变量
4.读写锁
5.记录上锁
进程(线程)间共享内存的2种接口:
1.匿名共享内存
2.有名共享内存
####################################################
posix的IPC:
posix信号量:
-lpthread
#include <semaphore.h>
posix消息队列:
-lrt
#include <mqueue.h>
posix共享内存
-lrt
#include <sys/mman.h>
posix的IPC函数都是库函数,还要包括头文件:
#include <fcntl.h>
#include <sys/stat.h>
使用相应的open函数创建或打开IPC时的参数:
name:
IPC的名字,Linux中的posix的IPC的名字要以 / 开头。
oflags:
O_RDONLY:只读,不能用于信号量
O_WRONLY:只写,只能用于消息队列
O_RDWR:读写,不能用于信号量
O_CREAT:不存在就创建,存在就返回存在的
O_EXCL:非它性创建
O_NONBLOCK:非阻塞式IO,只用于消息队列
O_TRUNC:若存在则短截,只用于共享内存
whenoflags=O_CREAT mode:指定权限位
S_IRUSR
S_IWUSR
S_IXUSR
S_IRGRP
S_IWGRP
S_IXGRP
S_IROTH
S_IWOTH
S_IXOTH
以上规则只适用于消息队列和信号量,共享内存的mode必须指定,如果没有指定O_CREAT,那么共享内存的mode=0.
####################################################
system v IPC:
system v信号量
#include <sys/sem.h>
system v消息队列
#include <sys/msg.h>
system v共享内存
#include <sys/shm.h>
system v的IPC函数都是系统调用,还要包含头的文件:
#include <sys/ipc.h>
#include <sys/types.h>
使用相应的get函数创建或打开IPC使用key_t 作为他们的名字。
ftok函数把一个已存在的路径和一个整数标识符转换成key_t值,称为IPC键。
#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok(const char *pathname, int proj_id);
所以system v的IPC的名字是一个文件,
linux中system v的IPC名字需要提前创建这个文件,才能用ftok转换。
内核给每个IPC对象维护的一个信息结构:
struct ipc_perm
{
IPC键:
key_t __key;
属主ID:
uid_t uid;
gid_t gid;
创建者ID:
uid_t cuid;
gid_t cgid;
权限:
unsigned short mode;
unsigned short __seq;
};
System v的IPC的查看和删除命令:
ipcs:查看system v的ipc
-m:共享内存
-q:消息队列
-s:信号量
ipcrm:删除system v的ipc