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

