pipe和fifo二三事

1.管道是什麼?node

管道是一種只存在於內存的特殊文件,沒有磁盤文件與之對應。管道是經過虛擬文件系統pipefs而實現的,pipefs與proc、sysfs等特殊文件系統同樣,只存在於內存中。另外,管道只能用於半雙工通訊。shell

2.pipe()一個管道意味着什麼?數組

pipe()在pipefs文件系統中建立一個新的索引節點,同時建立兩個file對象,一個file對象用於讀操做,一個file對象用於寫操做。pipe()最終將兩個file對象對應的文件描述符返回給用戶態進程,也就是向pipe()中傳遞的fd數組。數據結構

3.子進程execv()後是否還能繼續共享父進程的管道?併發

子進程execv()後,不能再繼續使用父進程建立的管道,由於子進程當前的上下文已經徹底被可執行文件替換。若是要繼續使用管道,子進程能夠在execv()以前將兩個文件描述符重定向到標準輸入和輸出。框架

4.描述管道的數據結構與索引節點的關係?對象

管道雖然是一種特殊文件,它仍然經過VFS框架中的inode來描述。因爲VFS要對全部不一樣的文件進行抽象描述,所以inode只對全部文件的共性進行描述。inode中的i_pipe字段指向pipe_inode_info結構,該結構用於描述管道的特性。索引

5.寫管道時寫入的字節量與管道大小的關係?進程

管道緩衝區一般爲一個單獨的頁框,所以大小默認爲4096字節。若是兩個或者多個進程併發的寫入一個管道,那麼任何少於4096字節的寫操做都是原 子的。可是,若是向管道寫入大於管道緩衝區大小的數據,則寫操做是能夠分割的,也就是說多個進程的寫操做能夠交叉進行,此時應該注意進程的同步。ip

6.有名管道是什麼?

有名管道是一種設備文件,有對應的磁盤索引節點。由於存在於磁盤上,所以能夠被任何進程打開使用。有名管道是一種半雙工通訊方式。

7.ls | more 的大體執行過程?

在終端執行ls | more時,shell進程fork()出一個進程A用來執行上述命令。A進程調用pipe(),返回文件描述符fd1和fd2,分別用於讀和寫管道。進程A兩次調用fork(),產生兩個子進程。進程A關閉fd1和fd2。

對於第一個子進程,它調用dup2(fd2,1)將寫文件描述符重定向到標準輸出。接下來調用execv()系統調用執行ls程序,該程序將本身的輸出寫入管道。

對於第二個子進程,它調用dup2(fd1,0)將讀文件描述符重定向到標準輸入。接下來調用execv()系統調用執行more程序,該程序從管道中讀取數據。

相關文章
相關標籤/搜索