linux下进程间通信方法:管道,消息队列,信号量,共享存储和套接字(其他:FIFO, 文件,信号)
1 半双工管道
使用pipe(fd)实现,用户父进程fork的子进程中。 通过read fd[0] write fd[1]实现。使用pipe实现的方法有:
(1)标准库提供popen和pclose
(2)协同进程,比如awk
无名管道简单方便.但局限于单向通信的工作方式.并且只能在创建它的进程及其子孙进程之间实现管道的共享:有名管道虽然可以提供给任意关系的进程使用.但是由于其长期存在于系统之中,使用不当容易出错。
2 消息队列
msgrcv/msgsnd为linux系统中异步或进程间通信的一种机制,这两个函数主要用于操作特定的消息队列。msgrcv()可以从消息队列中读取消息,msgsnd()将一个新的消息写入队列。
通过 key = ftok("msg.tmp", 0x01 ) ;获取key值,然后通过msgrcv/msgsnd进行消息交互
消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等特点,但是信息的复制需要额外消耗CPU的时间.不适宜于信息量大或操作频繁的场合
3 信号量
semctl
信号量是一个计数器,可以用来控制多个线程对共享资源的访问.,它不是用于交换大批数据,而用于多线程之间的同步.它常作为一种锁机制,防止某进程在访问资源时其它进程也访问该资源.因此,主要作为进程间以及同一个进程内不同线程之间的同步手段.
4 共享内存
shmdt
共享内存针对消息缓冲的缺点改而利用内存缓冲区直接交换信息,无须复制,快捷、信息量大是其优点。但存在写操作的同步问题;不方便网络通信。
5 套接字
套接口也是一种进程间通信机制,
一般来说,进程间的通信根据通信内容可以划分为两种:控制信息的传送与大批数据传送。
有时也把进程间控制信息的交换称为低级通信;而把进程间大批量数据的交换称为高级通信。
方法 | 特点 |
信号 | 传递信息少,触发某些行为(如中断) |
无名管道 | 单向通信;进程与子进程通信 |
有名管道 | 提供给任意关系的进程使用.因为长期存在于系统之中,容易出错.普通用户不建议使用 |
消息队列 | 克服信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等特点;但消耗CPU,不适宜信息量大或操作频繁的场合 |
共享内存 | 无须复制,快捷、信息量大;但是同步和网络通信需要考虑 |