首先dup和dup2函數是用於複製文件描述符的。他們倆的頭文件是#include<unistd.h>shell
先說一下dup函數。函數定義 int dup(fd) fd是一個某一個打開的文件的描述符,它的返回值是當前進程可用的最小的文件描述符,同時這個文件描述符和fd同時文件表中的同一個文件。函數
對於dup2函數,他也是用於複製文件描述符的可是對於這個函數咱們能夠指定它的文件描述符值,而不是在進程表的進程表項裏查找最小的。函數定義,int dup2(fd1, fd2) 這個函數會先判斷fd1和fd2是否是同一個值,若是是的就直接返回fd2。若是不是的,它會先把fd2指向的文件關閉,而後把fd1複製給fd2而後把fd2返回。code
由於dup2這個特性,咱們有時候會這麼用blog
dup2(fd, STDOUT_FILENO);
咱們不要它的返回值,同時把STOUT_FILENO指向fd所指向的文件。另外再加一點,從shell中運行一個進程,默認會有3個文件描述符存在(0、1、2),0與進程的標準輸入相關聯,1與進程的標準輸出相關聯,2與進程的標準錯誤輸出相關聯。而咱們的printf函數要想輸出到屏幕上也須要STOUT_FIENO 而這時候它被指向了一個文件,這樣通過這一步之後咱們的printf就會直接輸出到這個文件裏而不會輸出到屏幕上。可是有時候咱們又須要咱們寫的程序輸出到網頁或者屏幕上調錯,咱們這時候就須要 fork()函數了。fork會複製一個和父進程狀態同樣的子進程,而後咱們能夠在子進程中執行dup2而父進程的輸入輸出不受影響。進程
最後這個是進程文件表的關係class