檔案描述符的複製:
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 兩者都指向同乙個開啟的檔案描述符,因此共享檔案偏移量和檔案狀態標誌 語法 ...