国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

linux c之管道的介紹、創建關閉和簡單讀寫

2019-11-11 00:38:57
字體:
來源:轉載
供稿:網友

1、管道介紹、

       進程間通信的幾種主要手段中。其中管道和有名管道是最早的進程間通信機制之一,管道可用于具有親緣關系進程間的通信,有名管道克服了管道沒有名字的限制,因此,除具

      有管道所具有的功能外,它還允許無親緣關系進程間的通信。

 2、管道特點、

       管道是半雙工的,數據只能向一個方向流動;需要雙方通信時,需要建立起兩個管道; 只能用于父子進程或者兄弟進程之間(具有親緣關系的進程);單獨構成一種獨立的文件系統:管道對于管道兩端的進程而言,就是一個文件,但它不是普通的文件,它不屬于某種文件系統,而是自立門戶,單獨構成一種文件系統,并且只存在與內存中。

                   

3、 數據的讀出和寫入:

    一個進程向管道中寫的內容被管道另一端的進程讀出。寫入的內容每次都添加在管道緩沖區的末尾,并且每次都是從緩沖區的頭部讀出數據。然而 管道應用的一個重大限制是它沒有名字,因此,只能用于具有親緣關系的進程間通信, 在有名管 道(namedpipe或FIFO)提出后,該限制得到了克服。FIFO不同于管道之處在于它 提供一個路徑名與之關聯,以FIFO的文件形式存在于文件系統中。這樣,即使與FIFO的創建進程不存在親緣關系的進程,只要可以訪問該路徑,就能夠彼此通過FIFO相互通信(能夠訪問該路徑的進程以及FIFO的創建進程之間),因此,通過FIFO不相關的進程也能交換數據。值得注意的是,FIFO嚴格遵循先進先出(firstin first out),對管道及FIFO的讀總是從開始處返回數據,對它們的寫則把數據添加到末尾。它們不支持諸如lseek()等文件定位操作。

 4、 管道的創建

    #include    int pipe(int fd[2])    fd為filedescriptors的縮寫,其為一個二元數組,用于存放pipe函數所創建管道的兩個    文件描述符,fd[0]存放管道讀取端的文件描述符,fd[1]用于存放管道寫入端的文件描述符。    函數創建的管道的兩端處于一個進程中間,在實際應用中沒有太大意義,因此,一個進程在由    pipe()創建管道后,一般再fork一個子進程,需要是調用exec函數族使子進程執行所需程序    。然后通過管道實現父子進程間的通信(因此也不難推出,只要兩個進程中存在親緣關系,這    里的親緣關系指的是具有共同的祖先,都可以采用管道方式來進行通信)。

 5、 有名管道的創建

      #include      #include      int mkfifo(const char * pathname, mode_t mode)      該函數的第一個參數是一個普通的路徑名,也就是創建后FIFO的名字。第二個參數與打開普通文件      的open()函數中的mode 參數相同。      如果mkfifo的第一個參數是一個已經存在的路徑名時,會返回EEXIST錯誤,所以一般典型的調用      代碼首先會檢查是否返回該錯誤,如果確實返回該錯誤,那么只要調用打開FIFO的函數就可以了。      一般文件的I/O函數都可以用于FIFO,如close、read、write等等。      認清管道和有名管道的讀寫規則是在程序中應用它們的關鍵,下面就對管道和有名管道的讀寫規則      做的一點總結:   

      1、管道的讀寫規則:

       如果管道的寫端不存在,則認為已經讀到了數據的末尾,讀函數返回的讀出字節數為0;       當管道的寫端存在時,如果請求的字節數目大于PIPE_BUF,則返回管道中現有的數據字節數,如果       請求的字節數目不大于PIPE_BUF,則返回管道中現有數據字節數。       向管道中寫入數據時,linux將不保證寫入的原子性,管道緩沖區一有空閑區域,寫進程就會試圖向

       管道寫入數據。如果讀進程不讀走管道緩沖區中的數據,那么寫操作將一直阻塞。

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

       FIFO的打開規則:       如果當前打開操作是為讀而打開FIFO時,若已經有相應進程為寫而打開該FIFO,則當前打開       操作將成功返回;否則,可能阻塞直到有相應進程為寫而打開該FIFO(當前打開操作設置了       阻塞標志);或者,成功返回(當前打開操作沒有設置阻塞標志)。       如果當前打開操作是為寫而打開FIFO時,如果已經有相應進程為讀而打開該FIFO,則當前       打開操作將成功返回;否則,可能阻塞直到有相應進程為讀而打開該FIFO(當前打開操作       設置了阻塞標志);或者,返回ENXIO錯誤(當前打開操作沒有設置阻塞標志)。                  從FIFO中讀取數據:如果有進程寫打開FIFO,且當前FIFO內沒有數據,則對于設置了阻塞標志           的讀操作來說,將一直阻塞。               讀打開的阻塞標志只對本進程第一個讀操作施加作用,如果本進程內有多個讀操作序列,則       在第一個讀操作被喚醒并完成讀操作后,其它將要執行的讀操作將不再阻塞,即使在執行讀       操作時,FIFO中沒有數據也一樣(此時,讀操作返回0)。       如果沒有進程寫打開FIFO,則設置了阻塞標志的讀操作會阻塞。       由于使用有名管道時,需要在兩個將進行通信的進程中分別打有名名管道,因此,當一個進       程度打開(或寫打開)一個有名管道而沒有其他進程寫打開(或讀打開)此有名管道時,該進程           就會進入阻塞狀態,直到另一個進程寫打開(或讀打開)此有名管道。刪除一個有名管道可  

         以用unlink()。  

6、管道的創建和關閉代碼

      

7、結果

8、管道的讀寫代碼

9、結果


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 会理县| 新民市| 乌兰察布市| 南京市| 庆城县| 墨玉县| 攀枝花市| 武邑县| 大英县| 丰台区| 安宁市| 公安县| 弥渡县| 和硕县| 辽宁省| 安泽县| 建湖县| 清水县| 涿鹿县| 密云县| 道孚县| 邛崃市| 三门峡市| 祁东县| 天门市| 吕梁市| 中卫市| 治县。| 拜城县| 虎林市| 昌宁县| 军事| 周口市| 富平县| 陕西省| 花莲县| 阿坝县| 怀仁县| 石泉县| 龙井市| 海宁市|