Linux 进程间通信(IPC)

Posted zhou753099943

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 进程间通信(IPC)相关的知识,希望对你有一定的参考价值。

Linux 进程间通信(IPC)


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

以上是关于Linux 进程间通信(IPC)的主要内容,如果未能解决你的问题,请参考以下文章

深刻理解Linux进程间通信(IPC)

深刻理解Linux进程间通信(IPC)

IPC 进程间通信

Linux 进程间通信(IPC)

Linux 进程间通信(IPC)总结

Linux进程间通信 --- IPC机制(转)