Linux:dup/dup2 文件描述符重定向函数(有图有代码有真相!!!)
一、dup/dup2
有時我們希望把標準輸入重定向到一個文件,或者把標準輸出重定向到一個網(wǎng)絡(luò)連接。系統(tǒng)調(diào)用dup和dup2能夠復(fù)制文件描述符。dup返回新的文件文件描述符(沒有用的文件描述符最小的編號)。
dup2可以讓用戶指定返回的文件描述符的值,如果需要,則首先接近newfd的值,他通常用來重新打開或者重定向一個文件描述符。
1、dup函數(shù)
dup函數(shù)創(chuàng)建一個新的文件描述符,該新文件描述符和原有文件描述符oldfd指向相同的文件、管道或者網(wǎng)絡(luò)連接。并且dup返回的文件描述符總是取系統(tǒng)當(dāng)前可用的最小整數(shù)值。
dup和dup2失敗時返回-1并設(shè)置errno。
#include<stdio.h> #include<unistd.h> #include<fcntl.h> #include<string.h> #include<stdlib.h>int main() {//打開一個文件int fd = open("./test", O_CREAT | O_RDWR, 0666);if(fd <0){perror("open");return 1;}//1、關(guān)閉標準輸出文件描述符close(1);//2、進行重定向:使用最小未被使用的1來替代fd,即new_fd值是1,指向fd的表項int new_fd = dup(fd);if(new_fd < 0){perror("dup");return 2;}close(fd);//關(guān)閉不用的文件描述符,char buf[1024];while(1){memset(buf,'\0',sizeof(buf));ssize_t s = read(0,buf,sizeof(buf)-1);if(s > 0){buf[s -1] = 0;}if(strncmp("quit",buf,4) == 0)break;printf("%s\n",buf);//寫入文件fflush(stdout);//刷新,由行緩存變成了全緩沖}close(new_fd);return 0; }
2、dup2函數(shù)
通過 oldfd 復(fù)制出一個新的文件描述符 newfd,如果成功,newfd 和函數(shù)返回值是同一個返回值,最終 oldfd 和新的文件描述符 newfd 都指向同一個文件。
oldfd: 需要復(fù)制的文件描述符
newfd: 新的文件描述符,這個描述符可以人為指定一個合法數(shù)字(0-1023),如果指定的數(shù)字已經(jīng)被占用(和某個文件有關(guān)聯(lián)),此函數(shù)會自動關(guān)閉 close() 斷開這個數(shù)字和某個文件的關(guān)聯(lián),再來使用這個合法數(shù)字。
返回值:
成功:返回 newfd
失敗:返回 -1
#include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <stdlib.h> #include <string.h> #include <unistd.h>static void usage(const char* proc) {printf("Usage:%s[server_ip][server_port]\n",proc); } int main(int argc,char *argv[]) {if(argc != 3){usage(argv[0]);return 1;}int sock = socket(AF_INET,SOCK_STREAM,0);if(sock<0){perror("socket");return 2;}struct sockaddr_in peer;peer.sin_family = AF_INET;peer.sin_port = htons(atoi(argv[2]));peer.sin_addr.s_addr = inet_addr(argv[1]);int ret = connect(sock,(struct sockaddr*)&peer,sizeof(peer));if(ret<0){perror("connect");printf("%s\n",strerror(ret));return 3;}int dup = dup2(sock,1);//將標準輸出重定向至sockchar buf[1024];while(1){printf("Please enter:");fflush(stdout);ssize_t s=read(0,buf,sizeof(buf));if(s<0){perror("read");return 4;}buf[s-1]=0;if(strncmp("quit",buf,4) == 0)break;printf("%s",buf);//往sock中寫入消息fflush(stdout);}ssize_t _s = read(sock,buf,sizeof(buf));close(dup);close(sock);printf("sock:%s",buf);return 0; }
總結(jié)
以上是生活随笔為你收集整理的Linux:dup/dup2 文件描述符重定向函数(有图有代码有真相!!!)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 共轭梯度法笔记
- 下一篇: 百融大数据自助查询_百融大数据