unix环境高级编程-进程间通信
之前說(shuō)明了進(jìn)程控制原語(yǔ),但是這些進(jìn)程之間交換信息的唯一途徑就是傳送打開的文件,可以由fork或exec傳送,也可以通過(guò)文件系統(tǒng)來(lái)傳送,接下來(lái)說(shuō)明進(jìn)程之間相互通信的其他技術(shù)-進(jìn)程間通信(IPC)
管道:
管道是unix中IPC最古老的形式,管道有以下幾點(diǎn)局限:
1.歷史上是半雙工的
2.管道只能在具有共同父輩的兩個(gè)進(jìn)程間使用。
盡管有這些局限性,半雙工管道仍是最常見的IPC形式,每當(dāng)在管道中鍵入一個(gè)命令序列,讓shell執(zhí)行時(shí),shell都會(huì)為每一條命令單獨(dú)創(chuàng)建一個(gè)進(jìn)程,然后用管道將前一條命令進(jìn)程的標(biāo)準(zhǔn)輸出與后條命令的標(biāo)準(zhǔn)輸入相連接。
管道是通過(guò)調(diào)用pipe函數(shù)創(chuàng)建的。
#include <unistd.h>
int pipe(int fd[2]);
經(jīng)由參數(shù)fd返回兩個(gè)文件描述符:fd[0]為讀而打開,fd[1]為寫而打開,fd[1]的輸出是fd[0]的輸入。
下圖給出了兩周過(guò)描述半雙工管道的方法。左圖顯示管道的兩端在一個(gè)進(jìn)程相互連接,右圖則強(qiáng)調(diào)數(shù)據(jù)需要通過(guò)內(nèi)核在管道中流動(dòng)。
單個(gè)進(jìn)程中的管道幾乎沒有任何作用,通常進(jìn)程會(huì)先調(diào)用pipe,接著調(diào)用fork,從而創(chuàng)建父進(jìn)程到子進(jìn)程的IPC通道。下圖顯示了這種情況
對(duì)于從父進(jìn)程到子進(jìn)程的管道,父進(jìn)程關(guān)閉管道的讀端(fd[0]),子進(jìn)程關(guān)閉寫端(fd[1])。對(duì)于子進(jìn)程到父進(jìn)程的管道,父進(jìn)程關(guān)閉fd[1],子進(jìn)程關(guān)閉fd[0]。
當(dāng)管道的一端被關(guān)閉后,下列兩條規(guī)則起作用:
1.當(dāng)讀(read)一個(gè)寫端被關(guān)閉的管道時(shí),在所有數(shù)據(jù)都被讀取后,read返回0,表示文件結(jié)束。
2.如果寫(write)一個(gè)讀端已經(jīng)被關(guān)閉的管道,則產(chǎn)生信號(hào)SIGPIPE。
轉(zhuǎn)載于:https://www.cnblogs.com/sichenzhao/p/9320354.html
總結(jié)
以上是生活随笔為你收集整理的unix环境高级编程-进程间通信的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux关闭在线登录用户
- 下一篇: 云笈七签