dup()系統呼叫
今天看到dup和dup2系統呼叫,目前還不是太理解,先寫一點簡單的應用例項。
dup和dup2用來複制檔案描述符。
函式原型:
#include
int dup(int oldfd);
int dup2(int oldfd,int newfd);
dup用來複制oldfd所指的檔案描述符。但複製成功時返回最小的尚未被使用的檔案描述符。若有錯誤則返回-1,錯誤程式碼存入errno中。返回的新檔案描述符和引數oldfd指向同一個檔案,共享所有的鎖定,讀寫指標,和各項許可權或標誌位。
dup2可以用引數newfd指定新檔案描述符的數值。若newfd已經被程式使用,系統就會將其關閉以釋放該檔案描述符;若newfd與oldfd相等,dup2將返回newfd,而不關閉他。dup2呼叫成功返回新的檔案描述符,出錯則返回-1。
標準輸入(stdin),標準輸出(stdout),標準出錯資訊(stderr)的檔案號分別為0,1,2
一個簡單的例子:首先在當前目錄下存在一個檔案mytest2,檔案內容為hhhhhhhhhhhh
#include
#include
#include
#include
#include
#include
int main()
{
int oldfd;
oldfd = open("mytest2",O_RDWR|O_CREAT,0644);
dup2(oldfd,1); //複製oldfd到檔案描述符1(stdout標準輸出)
close(oldfd); //關閉檔案描述符oldfd
printf("ddd"); //在標準輸出上列印出ddd,這時由於標準輸出已經被oldfd檔案描述符代替
return 0; //列印到標準輸出上的內容就全部列印到了檔案mytest2中
}
程式執行結果為檔案mytest2中的內容變為:dddhhhhhhhhh
程式例項:檔名為file5.c
#include
#include
#include
#include
#include
#include
int main()
{
int fd;
int i;
if((fd=open("mytest3",O_CREAT|O_RDWR,0644))==-1){
printf("open file error!");
exit(1);
}
close(1); //關閉標準輸出
dup(fd); // 複製檔案描述符fd到1上
close(fd);
printf("writ to file\n");
return 0;
}
程式執行時結果:
moalong@xiyoulinux-desktop:~/along/code/c/part5$ make file5
cc file5.c -o file5
moalong@xiyoulinux-desktop:~/along/code/c/part5$ ./file5
moalong@xiyoulinux-desktop:~/along/code/c/part5$ cat mytest3
writ to file
dup和dup2用來複制檔案描述符。
函式原型:
#include
int dup(int oldfd);
int dup2(int oldfd,int newfd);
dup用來複制oldfd所指的檔案描述符。但複製成功時返回最小的尚未被使用的檔案描述符。若有錯誤則返回-1,錯誤程式碼存入errno中。返回的新檔案描述符和引數oldfd指向同一個檔案,共享所有的鎖定,讀寫指標,和各項許可權或標誌位。
dup2可以用引數newfd指定新檔案描述符的數值。若newfd已經被程式使用,系統就會將其關閉以釋放該檔案描述符;若newfd與oldfd相等,dup2將返回newfd,而不關閉他。dup2呼叫成功返回新的檔案描述符,出錯則返回-1。
標準輸入(stdin),標準輸出(stdout),標準出錯資訊(stderr)的檔案號分別為0,1,2
一個簡單的例子:首先在當前目錄下存在一個檔案mytest2,檔案內容為hhhhhhhhhhhh
#include
#include
#include
#include
#include
#include
int main()
{
int oldfd;
oldfd = open("mytest2",O_RDWR|O_CREAT,0644);
dup2(oldfd,1); //複製oldfd到檔案描述符1(stdout標準輸出)
close(oldfd); //關閉檔案描述符oldfd
printf("ddd"); //在標準輸出上列印出ddd,這時由於標準輸出已經被oldfd檔案描述符代替
return 0; //列印到標準輸出上的內容就全部列印到了檔案mytest2中
}
程式執行結果為檔案mytest2中的內容變為:dddhhhhhhhhh
程式例項:檔名為file5.c
#include
#include
#include
#include
#include
#include
int main()
{
int fd;
int i;
if((fd=open("mytest3",O_CREAT|O_RDWR,0644))==-1){
printf("open file error!");
exit(1);
}
close(1); //關閉標準輸出
dup(fd); // 複製檔案描述符fd到1上
close(fd);
printf("writ to file\n");
return 0;
}
程式執行時結果:
moalong@xiyoulinux-desktop:~/along/code/c/part5$ make file5
cc file5.c -o file5
moalong@xiyoulinux-desktop:~/along/code/c/part5$ ./file5
moalong@xiyoulinux-desktop:~/along/code/c/part5$ cat mytest3
writ to file
相關文章
- Linux下開發-dup和dup2Linux
- linux系統程式設計之檔案與IO(八):檔案描述符相關操作-dup,dup2,fcntlLinux程式設計
- Windows 系統呼叫Windows
- 物聯網學習教程Linux系統程式設計之檔案描述符的複製:dup()和dup2()Linux程式設計
- C程式函式呼叫&系統呼叫C程式函式
- 系統呼叫篇——SSDT
- Lec 04 系統呼叫
- Linux系統呼叫原理Linux
- linux系統呼叫getoptLinux
- Linux系統呼叫列表Linux
- perl中呼叫系統命令
- android 呼叫系統介面Android
- Android呼叫系統相機,相容7.0系統Android
- 作業系統 中斷異常系統呼叫作業系統
- 系統呼叫篇——3環層面呼叫過程
- 函式庫呼叫和系統呼叫的區別函式
- xenomai核心解析--雙核系統呼叫(三)--如何為xenomai新增一個系統呼叫AI
- jfinal系統啟動時呼叫的方法和系統停止時呼叫的方法
- fcntl函式實現dup函式
- FlutterUI 呼叫系統渲染引擎-13FlutterUI
- 分散式系統:遠端呼叫分散式
- 核心函式 系統呼叫 系統命令 庫函式函式
- 作業系統實驗4 系統呼叫聯絡作業系統
- 系統呼叫篇——0環層面呼叫過程(上)
- 系統呼叫篇——0環層面呼叫過程(下)
- Linux作業系統分析 | 深入理解系統呼叫Linux作業系統
- iOS呼叫系統功能與跳轉到系統設定iOS
- 作業系統實驗2 程式控制和系統呼叫作業系統
- TCP與DUP知識點整理TCP
- 系統呼叫篇——總結與提升
- 分散式系統呼叫鏈監控分散式
- Linux系統呼叫過程分析Linux
- MINIX系統呼叫EXIT分析 (轉)
- 呼叫系統螢幕保護 (轉)
- Linux系統呼叫講義(轉)Linux
- 3.系統呼叫跳轉流程
- Linux系統呼叫機制淺析Linux
- 如何區分CRM系統和呼叫中心?