重定向dup2的本质
生活随笔
收集整理的這篇文章主要介紹了
重定向dup2的本质
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在前一面一篇《UNIX I/O---再談文件描述符 》的基礎上,學習一下dup2函數。先看下面的代碼示例: #include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h> int main(int argc,char* argv[])
{
?int fd; fd = open("my.file",O_WRONLY|O_CREAT|O_APPEND,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
?if(fd == -1)
?{
??perror("\nERROR: fail to creat my.file.");
??return -1;?
?}
?
?if(dup2(fd,STDOUT_FILENO) == -1)
?{
??perror("\nERROR: fail to redirect std output.");
??return -1;
?}
?if(close(fd)==-1)
?{
??perror("\nERROR: fail to colse my.file.");
??return -1;
?}
?if(write(STDOUT_FILENO,"HELLO",5)==-1)
?{
??perror("\nERROR: fail to write to file.");
??return -1;
?}?
?return 0;
}
上面一段程序是一個比較簡單的創建文件、并將標準輸出重定向到文件的例子。 (1)open函數打開文件,文件不存在時,根據給定的參數進行文件創建,創建以后再打開。這里open()是操作系統在系統文件表內創建了一個條目,并設置描述符表中的條目[3]。 圖1 (2)dup2函數有2個參數fd1和fd2,如果文件描述符表的fd2條目是打開的,dup2將其關閉,并將條目fd1的指針拷貝到條目fd2中去。dup2執行失敗返回-1,并設置ERR NO,執行成功返回被復制的文件描述符。在這里,dup2執行完以后,標準輸出就被寫入到my.file 里了。 圖3 (3)調用函數close()刪除文件my.file額外的文件描述符表條目。執行后的示意圖如圖.3所示: 此后,想標準輸出打印HELLO,并不會看到HELLO的打印信息,而cat my.file顯示 my.file的內容,可以看到HELLO。可見標準輸出已經被重定向到my.file內部了。 執行結果: gaolu@gaolu-desktop:~$ gcc -o dup2.o systemcall2.c
gaolu@gaolu-desktop:~$ ./dup2.o
gaolu@gaolu-desktop:~$ cat my.file
HELLOgaolu@gaolu-desktop:~$
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h> int main(int argc,char* argv[])
{
?int fd; fd = open("my.file",O_WRONLY|O_CREAT|O_APPEND,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
?if(fd == -1)
?{
??perror("\nERROR: fail to creat my.file.");
??return -1;?
?}
?
?if(dup2(fd,STDOUT_FILENO) == -1)
?{
??perror("\nERROR: fail to redirect std output.");
??return -1;
?}
?if(close(fd)==-1)
?{
??perror("\nERROR: fail to colse my.file.");
??return -1;
?}
?if(write(STDOUT_FILENO,"HELLO",5)==-1)
?{
??perror("\nERROR: fail to write to file.");
??return -1;
?}?
?return 0;
}
上面一段程序是一個比較簡單的創建文件、并將標準輸出重定向到文件的例子。 (1)open函數打開文件,文件不存在時,根據給定的參數進行文件創建,創建以后再打開。這里open()是操作系統在系統文件表內創建了一個條目,并設置描述符表中的條目[3]。 圖1 (2)dup2函數有2個參數fd1和fd2,如果文件描述符表的fd2條目是打開的,dup2將其關閉,并將條目fd1的指針拷貝到條目fd2中去。dup2執行失敗返回-1,并設置ERR NO,執行成功返回被復制的文件描述符。在這里,dup2執行完以后,標準輸出就被寫入到my.file 里了。 圖3 (3)調用函數close()刪除文件my.file額外的文件描述符表條目。執行后的示意圖如圖.3所示: 此后,想標準輸出打印HELLO,并不會看到HELLO的打印信息,而cat my.file顯示 my.file的內容,可以看到HELLO。可見標準輸出已經被重定向到my.file內部了。 執行結果: gaolu@gaolu-desktop:~$ gcc -o dup2.o systemcall2.c
gaolu@gaolu-desktop:~$ ./dup2.o
gaolu@gaolu-desktop:~$ cat my.file
HELLOgaolu@gaolu-desktop:~$
轉載于:https://blog.51cto.com/keren/170892
總結
以上是生活随笔為你收集整理的重定向dup2的本质的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IT行业的日常工作方法 学习(转)
- 下一篇: 酒后驾车应严惩