建立進程只是個開始 若是你想控制運行中的進程,向進程發送數據或讀取它的輸出,該怎麼辦?經過進程間通訊,進程能夠協力完成某件工做。git
進程含有它正在運行的程序,還有棧和堆數據空間。除此以外,進程還須要記錄數據流的連向,好比標準輸出連到了哪裏(默認是屏幕btw)。進程用文件描述符表示數據流,所謂文件描述符其實就是一個數字。github
- 文件描述符是一個數字,它表明一條數據流。
# | 數據流 | 含義 |
---|---|---|
0 | 鍵盤 | 標準輸入 |
1 | 屏幕 | 標準輸出 |
2 | 屏幕 | 標準錯誤 |
3 | 數據庫鏈接 | 其它形式的數據流 |
建立進程之後,標準輸入連到鍵盤,標準輸出和標準錯誤都鏈接到屏幕。它們會保持這樣的鏈接,直到有人把它們重定向到了其餘地方。數據庫
- 文件描述符描述的不必定是文件。
重定向即替換數據流。ui
到目前爲止,咱們只用> <重定向過程序,但只要修改描述符表,進程也能重定向他們本身。 > - ./myprog >output.txt 2>error.log
> - 2>
表示將標準錯誤重定向。 > - ./myprog 2>&1
表示將標準錯誤重定向到標準輸出操作系統
FILE *my_file = fopen("guitar.mp3","r");
操做系統會打開guitar.mp3文件,而後返回一個指向它的指針,操做系統還會遍歷描述符表尋找空項,把新文件註冊在其中。 | # | 數據流 |含義| | :-------- | --------:| ---:| | 0 | 鍵盤 |標準輸入| | 1 | 屏幕 |標準輸出| | 2 | 屏幕 |標準錯誤| | 3 | 數據庫鏈接 |其它形式的數據流| | 4 | guitar.mp3 |其它形式的數據流| 調用fileno()
就能夠根據文件指針知道它是幾號文件描述符。dup2(4,3)
:將3號文件描述符指向4號文件描述符指向的數據流。sample指針