C 語(yǔ)言編程 — 管道(Pipe)
目錄

文章目錄
目錄
Linux 的管道指令
C 語(yǔ)言的匿名管道
命名管道
匿名管道和命名管道的區(qū)別
參考文檔
Linux 的管道指令
如果你熟悉 Linux,那么你對(duì)管道應(yīng)該不會(huì)感到陌生,我們經(jīng)常會(huì)使用 “|” 來(lái)使用管道。但是管道的真正定義是什么呢?
管道是一個(gè)進(jìn)程連接數(shù)據(jù)流到另一個(gè)進(jìn)程的通道,它通常用作把一個(gè)進(jìn)程的輸出通過(guò)管道連接到另一個(gè)進(jìn)程的輸入。
例如:ls -l | grep string。
C 語(yǔ)言的匿名管道
C 語(yǔ)言的匿名管道 pipe() 定義在頭文件 unistd.h 中。
int pipe(filedes[2]);
1
filedes[2]:用于接收 pipe 返回的兩個(gè)文件描述符:filedes[0] 為讀管道、filedes[1] 誒寫(xiě)管道。
返回值:成功返回 0,失敗返回 -1,并設(shè)置了 errno。
匿名管道實(shí)質(zhì)上是一個(gè)先進(jìn)先出(FIFO)的隊(duì)列:filedes[0] 是隊(duì)頭(front),filedes[1] 則作為隊(duì)尾(rear)。pipe() 創(chuàng)建的管道,本質(zhì)是一個(gè)內(nèi)核緩沖區(qū),該緩沖區(qū)的大小一般為一頁(yè),即 4K 字節(jié)。
命名管道
通過(guò)匿名管道來(lái)在進(jìn)程之間傳遞數(shù)據(jù)存在一個(gè)缺陷,就是這些進(jìn)程都由一個(gè)共同的父進(jìn)程啟動(dòng),這不便于我們?cè)诓幌嚓P(guān)的兩個(gè)進(jìn)程之前交換數(shù)據(jù),所以 C 語(yǔ)言進(jìn)入了 “命名管道”,用于解決不相關(guān)進(jìn)程間的通信問(wèn)題;
命名管道也被稱為 “FIFO 文件”,它是一種特殊類型的文件,在文件系統(tǒng)中以文件名的形式存在,它的行為與匿名管道類似。因?yàn)樵?Linux 中一切皆文件,所以命名管道的使用與文件的操作方式基本一致,可以在命令行中使用。
可以使用以下兩個(gè)函數(shù)之一來(lái)創(chuàng)建一個(gè)命名管道:
頭文件 sys/types.h、sys/stat.h 中定義的:
int mkfifo(const char *filename, mode_t mode); int mknod(const char *filename, mode_t mode | S_IFIFO, (dev_t)0);
1
2
這兩個(gè)函數(shù)都能創(chuàng)建一個(gè) FIFO 文件,注意,是真的創(chuàng)建了一個(gè)真實(shí)存在于文件系統(tǒng)中的文件,filename 指定了文件名,而 mode 則指定了文件的讀寫(xiě)權(quán)限。
可以直接在 Shell 中使用命令 mkfifo、mknod 來(lái)創(chuàng)建一個(gè) FIFO 文件:
$ mkfifo fifo_file $ mknod fifo_file p
1
2
匿名管道和命名管道的區(qū)別
使用匿名管道,通信的進(jìn)程之間需要一個(gè)父子關(guān)系,通信的兩個(gè)進(jìn)程一定是由一個(gè)共同的祖先進(jìn)程啟動(dòng),匿名管道沒(méi)數(shù)據(jù)交叉的問(wèn)題;
使用命名管道的兩個(gè)進(jìn)程可不存在 “血緣” 關(guān)系,但為了保證數(shù)據(jù)的安全,我們很多時(shí)候要采用阻塞的 FIFO,讓寫(xiě)操作變成原子操作;
參考文檔
https://www.zfl9.com/c-ipc-pipe.html
C 語(yǔ)言 Linux
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。