Linux 进程间通讯(IPC)
说明:首先要声明1点,我接下来要写的都针对在面试的时候被问的1些详解
1、为何要有进程间通讯?
解析:由于进程间通讯主要是强调在不同的进程间交换数据,而数据的交换必须依托内核来实现,任何1个进程的全局变量在另外一个进程中都是看不见的,所之内核开辟了1块缓冲区,进程A将数据放入内核,进程B从内核将数据取走,就实现了进程间通讯
2、进程间通讯有几种通讯方式?
解析:pipe、FIFO、system V 消息队列、system V 信号量、system V 同享内存
3、分别介绍几种通讯?
解析:pipe(管道):用pipe(int filedes[2])创建管道,创建后的管道有1个读端和写端,只能用于具有亲缘关系的进程间通讯、单向通讯、基于字节流。
FIFO(命名管道):克服了管道间只能在亲缘关系间通讯,它是创建了1个实实在在存在的文件,然后写端往文件里写,读端往文件里读出数据,总是先进先出,用int mkfifo(const char *filename,mode_t mode)、int mknod(const char *filename,mode_t mode |S_IFIFO,(dev_t)0);创建后的管道可用与任何进程间通讯
最重要的3个进程间通讯来了:(1)system V消息队列:它是基于消息的消息队列,也是分别创建读端和写端,能用于任何间进程通讯,需要3个函数来实现,int msgget(key_t key,int msgflg):创建消息队列或获得已存在的消息队列,int msgrcv(int msgqid,void *msgp,size_t msgzs,long msgtype,int msgflg):从队列中取消息,int msgsnd(int msgid,const
void*msgp,size_t msgzs,int msgflg):将数据放入消息队列中,int msgctl(int msgqid,int cmd,struct msgqid_ds *buf):设置消息队列属性
(2)system V信号量:信号量本身不具有让数据通讯的能力,它相当于1把锁,它本身只是1种外部资源的标示,用信号量来实现进程的互斥与同步,主要靠 semget,semop,semctl来实现进程通讯,就相当于互斥锁里的P、V操作
(3)system V同享内存:同享内存是所有IPC中通讯最快的,由于它内存中创建了1份缓冲区,所有的进程都可以被访问这块缓冲区,它速度快主要是对数据的访问只需进行两次拷贝就可以完成,而其他的进程间通讯都需要4次拷贝才能完成通讯,但它也有1个致命的缺点是在多进程中或在多线程中会出现线程安全,所有同享内存的通讯1般是和信号量或互斥锁、条件变量集合使用来保证数据的在通讯时候的1致性
ps:
消息队列、信号量、同享内存都有system V和POSIX之分,他们之间有1些区分,后期会补上