使用有名管道时,我们经常想要的是这样:在有名管道中没有数据时A进程挂起,当B进程往有名管道里写数据时激活A进程。于是就得考虑有名管道是如何使进程挂起,我们又当如何设置。
首先,在创建管道成功后,我们可以使用open()、read()和write()这些函数来操作有名管道。与普通文件的开发设置一样,对于为读而打开的管道可在open()中设置O_RDONLY,对于为写而打开的管道可在open()中设置O_WRONLY,在这里与普通文件不同的是阻塞问题。由于普通文件在读写时不会出现阻塞问题,而在管道的读写中却有阻塞的可能,这里的非阻塞标志可以在open()函数中设定为O_NONBLOCK。下面分别对阻塞打开和非阻塞打开的读写进行讨论。
对于读进程:
● 若该管道是阻塞打开,且当前FIFO内没有数据,则对读进程而言将一直阻塞到有数据写入。
● 若该管道是非阻塞打开,则不论FIFO内是否有数据,读进程都会立即执行读操作。即如果FIFO内没有数据,则读函数将立刻返回0。
对于写进程:
● 若该管道是阻塞打开,则写操作将一直阻塞到数据可以被写入。