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

      網(wǎng)友投稿 1866 2025-03-31

      目錄


      文章目錄

      目錄

      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ū)別

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

      使用匿名管道,通信的進(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)容。

      上一篇:SimPy:用 Python 模擬真實(shí)世界的進(jìn)程(simpy用來(lái)做什么)
      下一篇:如何鎖定單元格的寬度和高度,以防止在Excel中調(diào)整大???
      相關(guān)文章
      亚洲精品国产高清不卡在线 | 日韩va亚洲va欧洲va国产| 亚洲熟女www一区二区三区| 久久久久久久亚洲Av无码| 久久久久久亚洲精品| 久久精品国产亚洲AV麻豆不卡| 亚洲精品无码久久久久| 亚洲精品国精品久久99热一| 亚洲日韩国产精品第一页一区 | 亚洲小说区图片区| 亚洲成aⅴ人在线观看| 亚洲人成免费网站| 亚洲精品第一国产综合野| 亚洲国产成人久久99精品| 亚洲成人网在线播放| 4480yy私人影院亚洲| 亚洲精品美女久久久久9999| 亚洲天堂一区二区三区四区| 亚洲av日韩av无码av| 亚洲色无码国产精品网站可下载| 在线观看日本亚洲一区| 亚洲国产精品无码观看久久| 亚洲国产精品成人AV在线| 亚洲a无码综合a国产av中文| 亚洲国产精品碰碰| 国产亚洲av片在线观看18女人 | 亚洲综合国产一区二区三区| 亚洲色中文字幕无码AV| 亚洲国产精品无码专区影院 | 国产成人高清亚洲一区久久| 亚洲国产av无码精品| 国产偷窥女洗浴在线观看亚洲| 日日噜噜噜噜夜夜爽亚洲精品| 九月丁香婷婷亚洲综合色| 亚洲天天做日日做天天欢毛片| 亚洲成A∨人片在线观看无码| 日韩亚洲人成在线| 亚洲AV永久无码精品网站在线观看 | 亚洲人成色777777老人头| 亚洲Av无码国产一区二区| 亚洲av无码乱码在线观看野外|