dup()函數和dup2()函數書上在文件操作那一章,已經講過了,這周看重定向這塊,發現它挺重要,就再看了回,記錄下。
1、 dup函數
頭文件及函數定義:
#include <unistd.h> int dup(int oldfd);
dup用來復制參數oldfd所指的文件描述符。當復制成功是,返回最小的尚未被使用過的文件描述符,若有錯誤則返回-1.錯誤代碼存入errno中返回的新文件描述符和參數oldfd指向同一個文件,這兩個描述符共享同一個數據結構,共享所有的鎖定,讀寫指針和各項全現或標志位。
調用dup(oldfd)等效於
fcntl(oldfd, F_DUPFD, 0)
代碼示例:
#include<stdio.h> #include<sys/stat.h> #include<fcntl.h> #include<unistd.h> int main(int argc, char* argv[]) { int fd=open("text.txt", O_CREAT|O_RDWR|O_TRUNC, S_IRUSR|S_IWUSR); if(fd < 0) { printf("Open Error!\n"); return 0; } int fd2=dup(fd); if(fd2<0) { printf("Error!\n"); return 0; } char buf[1000]; int n; while((n=read(STDIN_FILENO, buf,1000)) > 0) //接受鍵盤輸入,並將其存入buf所指向的緩存中 { if(write(fd2, buf, n)<n) //將buf所指向的緩存區的n個字節的數據寫入到由文件描述符fd2所指示的文件中 { printf("Write Error!!\n"); return 0; } } return 0; }
STDIN_FILENO:接收鍵盤的輸入
STDOUT_FILENO:向屏幕輸出
運行結果:
從代碼結果可以看出fd這個描述符指向text.txt,然后調用dup函數對 fd進行拷貝,拷貝到d2,然后write(fd2,buf,n)這句將從鍵盤輸入到buf所指的緩沖區的數據寫到 fd2所指向的文件后。所以我們在查看text.txt,看到了我們輸入的東西。
2、dup2函數
頭文件及其定義:
#include <unistd.h> int dup2(int oldfd, int newfd);
dup2與dup區別是dup2可以用參數newfd指定新文件描述符的數值。若參數newfd已經被程序使用,則系統就會將newfd所指的文件關閉,若newfd等於oldfd,則返回newfd,而不關閉newfd所指的文件。dup2所復制的文件描述符與原來的文件描述符共享各種文件狀態。共享所有的鎖定,讀寫位置和各項權限或flags等.
返回值:
若dup2調用成功則返回新的文件描述符,出錯則返回-1.
dup2(oldfd, newfd)等效於
close(oldfd);
fcntl(oldfd, F_DUPFD, newfd);
在shell的重定向功能中,(輸入重定向”<”和輸出重定向”>”)就是通過調用dup或dup2函數對標准輸入和標准輸出的操作來實現的。
代碼示例:
#include <unistd.h> #include <fcntl.h> #include <stdlib.h> #include <string.h> #include <stdio.h> void main() { int oldfd; int fd; int t; char *buf="This is a test!!!!\n"; if((oldfd=open("mine.txt",O_RDWR|O_CREAT,0644))==-1) { printf("open error\n"); exit(-1); } fd=dup2(oldfd,fileno(stdout)); if(fd==-1) { printf("dup2 error\n"); exit(-1); } printf("dup2的返回值:%d\n",fd); t=strlen(buf); if(write(fileno(stdout),buf,t)!=t)//本應該寫入到stdout的信息,但是標准輸出已經重定向到目標文件中,故向標准輸出寫的數據將會寫到目標文件中。 { printf("write error!\n"); exit(-1); } close(fd); exit(0); }
運行結果:
從運行結果看到本應該輸出到屏幕的信息,但是標准輸出已經重定向到目標文件中,故向標准輸出寫的數據寫到了mine.txt中。
---------------------
作者:yi@ybfq1104
來源:CSDN
原文:https://blog.csdn.net/tiandc/article/details/81489447
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!