日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux:dup/dup2 文件描述符重定向函数(有图有代码有真相!!!)

發布時間:2023/12/20 linux 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux:dup/dup2 文件描述符重定向函数(有图有代码有真相!!!) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、dup/dup2

有時我們希望把標準輸入重定向到一個文件,或者把標準輸出重定向到一個網絡連接。系統調用dup和dup2能夠復制文件描述符。dup返回新的文件文件描述符(沒有用的文件描述符最小的編號)。

dup2可以讓用戶指定返回的文件描述符的值,如果需要,則首先接近newfd的值,他通常用來重新打開或者重定向一個文件描述符。




1、dup函數

dup函數創建一個新的文件描述符,該新文件描述符和原有文件描述符oldfd指向相同的文件、管道或者網絡連接。并且dup返回的文件描述符總是取系統當前可用的最小整數值。

dup和dup2失敗時返回-1并設置errno。

1.打開一個新文件

2.關掉標準輸出文件符

3.調用dup給文件描述符

4.此時文件描述符變為1

5.將所要打印數據重定向到文件中


#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、關閉標準輸出文件描述符close(1);//2、進行重定向:使用最小未被使用的1來替代fd,即new_fd值是1,指向fd的表項int new_fd = dup(fd);if(new_fd < 0){perror("dup");return 2;}close(fd);//關閉不用的文件描述符,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函數


通過 oldfd 復制出一個新的文件描述符 newfd,如果成功,newfd 和函數返回值是同一個返回值,最終 oldfd 和新的文件描述符 newfd 都指向同一個文件。



oldfd: 需要復制的文件描述符


newfd: 新的文件描述符,這個描述符可以人為指定一個合法數字(0-1023),如果指定的數字已經被占用(和某個文件有關聯),此函數會自動關閉 close() 斷開這個數字和某個文件的關聯,再來使用這個合法數字。

返回值:


成功:返回 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; }



總結

以上是生活随笔為你收集整理的Linux:dup/dup2 文件描述符重定向函数(有图有代码有真相!!!)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。