无名管道(或称为管道)
具有两个对外端口,一个称为读端,一个称为写端。一个进程在管道的写端写数据,另一个进程从管道的读端读取数据。
管道仅局限于父进程与子进程之间的通信。
管道通信的特点:
1.管道通讯是单向的,有固定的读端和写端。
2. 数据被进程从管道读出后,在管道中该数据就不存在了。
3. 当进程去读取空管道的时候,进程阻塞。
4. 当进程往满管道写数据时,进程阻塞。
5. 系统常量PIPE_BUF规定了内核的管道缓冲区大小。
有名管道(或称为FIFO)
当open一个fifo时,非阻塞标志(O_NONBLOCK)会产生如下影响:
1、一般情况下(没有指定O_NONBLOCK),只读open要阻塞到某个其他进程为写而打开这个FIFO为止。类似的,只写open要阻塞到某个其他进程为读而打开它为止。
2、如果指定了O_NONBLOCK,则只读open立即返回。但是,如果没有进程为读而打开一个fifo,那么只写open将返回-1,并将errno设置成ENXIO。
消息队列
信号量
信号量是一个计数器,用于为多个进程提供对共享数据的访问,其值实则表征有多少个共享资源单位可供共享应用。为了获得共享资源,进程需要执行下列操作:
1、测试控制该资源的信号量。
2、若此信号量的值为正,则进程可以使用该资源。在这种情况下,进程会将信号量值减1,表示他使用了一个资源单位。
3、否则,若此信号量的值为0,表明无可用资源,则进程进入休眠状态,直至其他进程不再使用共享资源,信号量的值增1,此时信号量大于0,处于休眠的进程被唤醒。返回步骤1。
常用的信号量形式被称为二元信号量,他控制单个资源,其初始值为1。