複製檔案描述符dup和dup2

2021-08-15 20:53:21 字數 2359 閱讀 3434

檔案描述符的複製:

dup和dup2是兩個非常有用的系統呼叫,都是用來複製乙個檔案的描述符,使新的檔案描述符也標識舊的檔案描述符所標識的檔案。

>> int dup(int oldfd);

>> int dup2(int oldfd,int newfd);

dup和dup2經常用來重定向程序的stdin,stdout和strerr。如:ls > log.txt 將ls的輸出資訊重定向到log.txt

1、dup函式

#include

int dup(int oldfd);

功能:複製oldfd檔案描述符,並分配乙個新的檔案描述符,新的檔案描述符是呼叫程序檔案描述符表中最小可用的檔案描述符。

引數:要複製的檔案描述符oldfd。

返回值:成功返回新的檔案描述符,失敗返回-1;錯誤**存於errno中。

#include #include #include #include #include #include int main(int argc,char *argv)

close(1);

fd1 = dup(fd);

printf("fd1 = %d\n",fd1);

return 0;

}

執行結果如下:

2、dup2:dup的公升級版本

#include

int dup2(int oldfd, int newfd);

功能:複製乙份開啟的檔案描述符oldfd,並分配新的檔案描述符newfd,newfd也標識oldfd所標識的檔案。

注意:newfd是小於檔案描述符最大允許值的非負整數(<=1023,總共1024個檔案描述符),如果newfd是乙個已經開啟的檔案描述符,則首先關閉該檔案,然後再複製。

引數:要複製的檔案描述符oldfd,分配新的檔案描述符newfd。

返回值:成功返回newfd;失敗返回-1,錯誤**存於errno中。

#include #include #include #include #include #include int main(int argc,char *argv)

fd1 = dup2(fd,1);//讓1也代表fd所代表的檔案

printf("fd1 = %d\n",fd1);

return 0;

}

執行結果如下:

3、複製檔案描述符後新舊檔案描述符的特點

使用dup或dup2複製檔案描述符後,新檔案描述符和舊檔案描述符指向(標識/代表)同乙個檔案,共享檔案的鎖定、讀寫位置和各項許可權(唯讀/只寫)。(屬性)

當關閉新的檔案描述符時,通過舊檔案描述符仍可操作檔案。

當關閉舊的檔案描述符時,通過新的檔案描述符仍可操作檔案。

4、exec前後檔案描述符的特點(程序沒有變,即exec之後還能不能用exec前的那張檔案描述符的表)

close_on_exec標誌決定了檔案描述符在執行exec後檔案描述符是否可用。

檔案描述符的close_on_exec標誌預設是關閉的,即檔案描述符在執行exec後檔案描述符是可用的。

若沒有設定close_on_exec標誌位,程序中開啟的檔案描述符,及其相關的設定在exec後不變,可供新啟動的程式使用。

設定close_on_exec標誌位的方法:

int flags;

flags = fcntl(fd,f_getfd); //獲得標誌

flags |= fd_cloexec; //開啟標誌位

flags &= ~fd_cloexec; //關閉標誌位

fcntl(fd,f_setfd,flags); //設定標誌

#include #include #include #include #include #include int main(int argc,char *argv)

pid = fork();

if(pid < 0)

else if(pid == 0)

else

return 0;

}

編譯執行後結果如下:

3 12 dup函式 檔案描述符複製

dup函式用於從乙個已存在的檔案描述符複製乙個新檔案描述符。函式原型如下 include int dup int filedes 返回值 若賦值成功則返回新檔案描述符,若出錯則返回 1 引數 filedes被複製檔案描述符。例項 x.3.12.1.c include include include ...

檔案描述符存在形式及其dup2函式的使用

最近寫myshell的時候,用到了dup2這個函式,函式的形式看著很簡單,但是當時就是很不理這麼用的意義在 不知道它具體是怎麼實現重定向輸入輸出的。後來上網查了很多資料,從檔案描述符開始來了解,想了想。對於核心來說,都是通過檔案描述符去開啟檔案的,而標準輸入輸出都是檔案。標準輸出檔案 stdout ...

Linux 系統呼叫 dup 和dup2

1 dup dup 系統呼叫會建立檔案描述符的乙個拷貝 1 新生成的檔案描述符是程序中最小的未使用的檔案描述符,0 1 2對應標準輸入 標準輸出 標準錯誤輸出 2 如果拷貝成功,那麼原始的和拷貝的檔案描述符可能會交叉使用 3 兩者都指向同乙個開啟的檔案描述符,因此共享檔案偏移量和檔案狀態標誌 語法 ...