有名管道:mkfifo write read close无名管道:pipe write read close信号: signal kill raise pause alarm
信号量: man sem_overview
有名:sem_open sem_close sem_unlink无名:sem_init sem_destroysem_post sem_wait sem_getvalue
共享内存: man shm_overview
shm_open shm_unlink mmap munmap
消息队列: man mq_overview
mq_open mq_close mq_unlink mq_send mq_receive
信号量集:
semget semctl semop
共享内存:
shmget shmctl shmat shmop
消息队列:
msgget msgop msgctl msgsnd msgrcv
Socket通信
连接:
SERVER: socket bind listen accept recv sendCLIENT: socket bind connect send recv
无连接:
SERVER: socket bind recvfrom sendtoCLIENT: socket bind sendto recvfrom
有名管道(命名管道)它只能用于有亲缘关系(父子,兄弟等)的进程间的通信。它是一个半双工的通信模式,具有固定的读端和写端。管道可以看成特殊的文件,对它的操作可以使用read和write,它不属于任何文件系统,存在于内存中。
它可以实现不相关的两个进程间彼此通信。命令管道FIFO严格按照先进先出的规则。不支持lseek操作。命名管道在文件系统中是可见的,使用mkfifo可以创建该类型文件
常用函数
pipe,read,write,mkfifo
注意事项
int pipe(int fd[2]),下标为0的为读端,下标为1的为写端
只有在读端存在的时候写入才有意义,否则,向管道写入数据的进程将收到SIGPIPE信号,进程被杀死。
忽略信号即对信号不做任何处理,其中 SIGKILL和SIGSTOP不能被忽略 。
Linux对每种信号都有默认的处理,使用该方式进行处理信号。
使用signal()函数注册信号处理函数,在信号来时执行预定的处理函数。
消息队列就是一些消息的列表,用户可以在消息队列中添加小写和读取消息等。从这点上看,消息队列具有FIFO的特性,但是它可实现消息的随机查询,比FIFO具有更大的优势,同时这些消息存在于内核中,有队列ID来标识。使用ipcs -q查看当前系统的消息队列状态。
常用函数
ftok() 获取key
msgget() 获取消息队列id
msgsnd() 向消息队列发送消息
msgrcv() 从消息队列接收消息
msgctl() msg通用控制函数
为了在多个进程间交换信息,内核专门流出了一块内存区,这块内存可以由需要访问的进程映射到自己的私有地址空间,从而进程可以直接读写这一段内存,不需要复制数据。因此共享内存是最为高效的进程间通信方式。使用ipcs -m查看当前系统中共享内存使用状态。
间接制约指进程间相互争夺共享资源的关系,例如进程争夺CPU时间片、I/O设备。我们把进程间争夺共享资源的关系称为互斥关系。
直接制约指进程间相互合作的关系,即需要按条件有固定顺序的访问某资源。例如读者与写者问题,进程A的输出结果,进程B需要用到,所以进程B必须先等进程A完成。我们把进程间有固定顺序的操作某些资源的合作关系称为同步关系。
如果有可用资源(信号量值>0),则占用一个资源(给当前信号量值减一,进入临界区代码);如果当前没有可用资源(信号量值=0),则进程被阻塞直到系统将资源分配给该进程(进入等待队列,直到资源轮到该进程使用)。
如果在该信号的等待队列中有进程在等待资源,则唤醒一个阻塞进程;如果没有进程等待该资源,则释放一个资源(给当前信号量值加一)。