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程序,該程序從管道中讀取數據。