日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

进程间通信(一)管道

發布時間:2025/7/14 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 进程间通信(一)管道 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、概述

在Linux系統中,以進程為單位來分配和管理資源。
由于保護的緣故,一個進程不能直接訪問另一個進程的資源,也就是說,進程之間互相封閉。
在一個復雜的應用系統中,通常會使用多個相關的進程來共同完成一項任務,因此要求進程之間必須能夠互相通信,從而來共享資源和信息。
所以,一個操作系統內核必須提供進程間的通信機制。

管道

管道和有名管道是最早的進程間通信機制之一,管道可用于具有親緣關系進程間的通信,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關系進程間的通信。

管道是指用于連接一個讀進程和一個寫進程,以實現它們之間通信的共享方式,又稱pipe文件。

管道是Linux支持的最初Unix IPC形式之一,具有以下特點:

管道是半雙工的,數據只能向一個方向流動;需要雙方通信時,需要建立起兩個管道;

只能用于父子進程或者兄弟進程之間(具有親緣關系的進程);

單獨構成一種獨立的文件系統:管道對于管道兩端的進程而言,就是一個文件,但它不是普通的文件,它不屬于某種文件系統,而是自立門戶,單獨構成一種文件系統,并且只存在與內存中。

數據的讀出和寫入:一個進程向管道中寫的內容被管道另一端的進程讀出。寫入的內容每次都添加在管道緩沖區的末尾,并且每次都是從緩沖區的頭部讀出數據。

管道是所有Unix都提供的一種IPC機制

一個進程將數據寫入管道,另一個進程從管道中讀取數據

在shell中使用管道的例子

命令:“ls | more”

使用pipeline “|”將兩個命令”ls”和“more”連接起來,使得ls的輸出成為more的輸入

也可以使用如下的兩個命令

命令1:“ls > tmp”

命令2:”more < tmp”

命令1把ls的輸出重定向到tmp文件中;

命令2把more的輸入重定向到tmp文件

創建管道

管道的創建:
#include <unistd.h>
int pipe(int fd[2])
該函數創建的管道的兩端處于一個進程中間,在實際應用中沒有太大意義,因此,一個進程在由pipe()創建管道后,一般再fork一個子進程,然后通過管道實現父子進程間的通信。

注意:fd[0] 用于讀取管道,fd[1] 用于寫入管道。

管道讀寫

管道主要用于不同進程間通信。實際上,通常先創建一個管道,再通過fork函數創建一個子進程。

子進程寫入和父進程讀的命名管道:

管道的讀寫規則

管道兩端可分別用描述字fd[0]以及fd[1]來描述。
需要注意的是,管道的兩端是固定了任務的。即一端只能用于讀,由描述字fd[0]表示,稱其為管道讀端;另一端則只能用于寫,由描述字fd[1]來表示,稱其為管道寫端。
如果試圖從管道寫端讀取數據,或者向管道讀端寫入數據都將導致錯誤發生。
一般文件的I/O函數都可以用于管道,如close、read、write等等。

系統文件 write(fd[1],buf,size)

功能:把buf中的長度為size字符的消息送入管道入口fd[1]
fd[1]—pipe入口
buf:存放消息的空間
size :要寫入的字符長度

系統文件 read(fd[0],buf,size)

功能:從pipe出口fd[0]讀出size字符的消息置入 buf中。
fd[0]――Pipe的出口

進程通信 管道 (pipe系統調用)

pipe(fd): 創建一個管道,fd[0]為管道的讀端;fd[1]為管道的寫端。 管道可用來實現父進程與其子孫進程之間的通信。管道以FIFO方式傳送消息。

#include <stdio.h> ...... main() { int x,fd[2]; char buf[30],s[30]; pipe(fd); /*創建管道*/ while((x=fork()) = = -1); /*創建子進程失敗時,循環*/ if(x = = 0) { sprintf(buf,“This is an example\n”); write(fd[1],buf,30); /*把buf中的字符寫入管道*/ exit(0); } wait(); read(fd[0],s,30); /*父進程讀管道中的字符*/ printf(“%s”,s); }

有名管道

管道應用的一個重大限制是它沒有名字,因此,只能用于具有親緣關系的進程間通信,在有名管道(named pipe或FIFO)提出后,該限制得到了克服。

FIFO不同于管道之處在于它提供一個路徑名與之關聯,以FIFO的文件形式存在于文件系統中。這樣,即使與FIFO的創建進程不存在親緣關系的進程,只要可以訪問該路徑,就能夠彼此通過FIFO相互通信(能夠訪問該路徑的進程以及FIFO的創建進程之間)。

因此,通過FIFO不相關的進程也能交換數據。值得注意的是,FIFO嚴格遵循先進先出(first in first out),對管道及FIFO的讀總是從開始處返回數據,對它們的寫則把數據添加到末尾。

有名管道的創建

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char * pathname, mode_t mode)

該函數的第一個參數是一個普通的路徑名,也就是創建后FIFO的名字。
第二個參數與打開普通文件的open()函數中的mode 參數相同。
如果mkfifo的第一個參數是一個已經存在的路徑名時,會返回EEXIST錯誤,所以一般典型的調用代碼首先會檢查是否返回該錯誤,如果確實返回該錯誤,那么只要調用打開FIFO的函數就可以了。一般文件的I/O函數都可以用于FIFO,如close、read、write等等。

有名管道比管道多了一個打開操作:open。

FIFO的打開規則:

如果當前打開操作是為讀而打開FIFO時,若已經有相應進程為寫而打開該FIFO,則當前打開操作將成功返回;否則,可能阻塞直到有相應進程為寫而打開該FIFO(當前打開操作設置了阻塞標志);或者,成功返回(當前打開操作沒有設置阻塞標志)。

如果當前打開操作是為寫而打開FIFO時,如果已經有相應進程為讀而打開該FIFO,則當前打開操作將成功返回;否則,可能阻塞直到有相應進程為讀而打開該FIFO(當前打開操作設置了阻塞標志);或者,返回ENXIO錯誤(當前打開操作沒有設置阻塞標志)。

#include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> main() { char buffer[80]; int fd; char *FIFO=“pipe1”; mkfifo(FIFO,0666); if(fork()>0){ char s[ ] = "hello!\n";fd = open (FIFO,O_WRONLY); write(fd,s,sizeof(s)); close(fd); } else{ fd= open(FIFO,O_RDONLY);read(fd,buffer,80); printf("%s",buffer); close(fd); } }

管道的局限性

從IPC的角度看,管道提供了從一個進程向另一個進程傳輸數據的有效方法。但是,管道有一些固有的局限性:

1.因為讀數據的同時也將數據從管道移去,因此,管道不能用來對多個接收者廣播數據。
2.管道中的數據被當作字節流,因此無法識別信息的邊界。

如果一個管道有多個讀進程,那么寫進程不能發送數據到指定的讀進程。同樣,如果有多個寫進程,那么沒有辦法判斷是它們中哪一個發送的數據。

轉載于:https://www.cnblogs.com/yanghaishu/archive/2012/05/10/2495201.html

總結

以上是生活随笔為你收集整理的进程间通信(一)管道的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 放荡闺蜜高h苏桃情事h | 欧美乱轮视频 | 日韩欧美国产一区二区三区 | 禁果av一区二区三区 | 日日干日日摸 | 西西44rtwww国产精品 | 日产毛片 | 天天插日日干 | 欧美精品色呦呦 | 91精品91久久久中77777老牛 | 免费视频91 | 日韩电影一区二区三区四区 | 综合激情久久 | 国产三级免费观看 | 免费看污黄网站在线观看 | 亚洲网站免费看 | 打屁股调教网站 | 蜜臀少妇久久久久久久高潮 | 亚洲黄片一区 | 色婷婷777 | 色校园 | 欧美射射射 | 日韩xxxxxxxxx| 天天碰天天 | 欧美亚洲一区二区三区 | a天堂视频在线观看 | 熟女精品一区二区三区 | 亚洲成人基地 | 牛牛澡牛牛爽一区二区 | 国产福利一区二区三区在线观看 | av一起看香蕉 | 口述3p做爰全过程 | 日韩视频在线观看二区 | 97精品国产97久久久久久粉红 | 亚洲欧美一级 | 色婷婷色 | 黄色片网站在线免费观看 | 好吊一区二区三区视频 | 波多野结衣在线观看视频 | 久久久久久艹 | 日韩精品电影一区二区三区 | 九九黄色大片 | 欧美日本一道 | 老汉av网站 | 国产欧美一区二区三区在线看蜜臀 | 欧美亚洲另类视频 | 黄色www| 一级片中文字幕 | 呦呦精品| 热热色国产 | 99福利视频导航 | 久久久国产精华液 | 中文字幕+乱码+中文字幕明步 | 日本黄色免费看 | 欧美日韩成人一区二区在线观看 | 欧美日韩成人一区二区在线观看 | 国产区免费观看 | 国产精品日韩一区二区 | 亚洲激情图片区 | 黄a大片| 欧美超碰在线观看 | 久久久精品亚洲 | 欧美成人精品一区二区 | 久久久久人妻一区精品色欧美 | 俄罗斯厕所偷拍 | 国产毛片自拍 | v片在线观看| 亚洲综合av一区二区 | 国产破处av | 99精品一级欧美片免费播放 | 欧美大片免费在线观看 | 日本黄页网站免费大全 | 欧美日韩一区免费 | av第一福利 | sese视频在线观看 | 精品成人一区二区三区久久精品 | 骚虎av在线 | 亚洲AV成人无码精品久久盆瓶 | 久久久精品人妻一区二区三区色秀 | 91福利视频网站 | 黄色三级国产 | 婷婷色基地 | 国产91白丝在一线播放 | 亚洲欧美在线视频免费 | 国语对白真实视频播放 | 美国性生活大片 | 污污内射久久一区二区欧美日韩 | 奴性女会所调教 | 少妇太爽了 | 亚洲天堂免费观看 | 毛片基地视频 | 天堂网91 | 农村黄色片 | 欧美a在线看| 北条麻纪在线观看aⅴ | 可以看毛片的网站 | 黄色毛毛片 | 亚洲一页 | 国产精品高清无码在线观看 |