檔案描述符的重定向 dup dup2

2021-08-02 04:28:35 字數 2389 閱讀 8408

dup/dup2:進行檔案描述符的重定向即建立乙個oldfd的副本。

dup:最低編號、未被使用的檔案描述符是oldfd的乙份拷貝。

dup2:newfd是oldfd的乙份拷貝。

返回值:成功(newfd); 失敗(-1)。

基於tcp的socket程式設計:

基於tcp的socket程式設計中的多執行緒伺服器為例,將標準輸出重定向到client端的socket中。

**示例:

//server端

#include

#include

#include

#include

#include

#include

#include

#include

static

void usage(const

char* proc)

int startup(const

char* _ip,int _port)

struct sockaddr_in servaddr;

servaddr.sin_family = af_inet;

servaddr.sin_port = htons(_port);

servaddr.sin_addr.s_addr = inet_addr(_ip);

if(bind(sock,(struct sockaddr*)&servaddr,sizeof(servaddr))<0)

if(listen(sock,10)<0)

return sock;

}void *handler(void * _sock)

else

fflush(stdout);

}return (void *)0;

}int main(int argc,char *argv)

int listen_sock = startup(argv[1],atoi(argv[2]));

struct sockaddr_in clientaddr;

socklen_t len = sizeof(clientaddr);

while(1)

printf("client ip:%s port:%d\n",inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port));

pthread_t id ;

if(pthread_create(&id,null,handler,(void *)sock)<0)

pthread_detach(id);

}return

0;}

//client端

#include

#include

#include

#include

#include

#include

#include

static

void usage(const

char* proc)

int main(int argc,char *argv)

int sock = socket(af_inet,sock_stream,0);

if(sock<0)

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)

dup2(sock,1);//將標準輸出重定向至sock

結果可對比觀察其異同。

使用dup dup2進行檔案描述符重定向

當乙個程序執行時,會有相應的檔案描述符 linux一切皆檔案 一般會有3個預設的檔案描述符 0 與標準輸入關聯 1 與標準輸出關聯 2 與標準錯誤輸出關聯 dup dup2函式,對檔案描述符重定向 close 1 關閉要重定向的檔案描述符 dup fd,1 將標準輸出重定向到開啟的檔案 dup2 f...

檔案描述符 輸出重定向

對於核心而言,所有開啟的檔案都是通過檔案描述符引用的。那麼檔案描述符又是什麼呢?通過上圖,我們可以清楚的認識到檔案描述符就是從0開始的小的非負整數,核心用以標識乙個特定程序正在訪問的檔案。當開啟乙個檔案或建立乙個檔案,核心向程序返回乙個檔案描述符。linux程序預設情況下會有三個預設開啟的檔案描述符...

檔案描述符與重定向

1 標準輸出和標準錯誤重定向 2 利用 操作符將檔案讀入stdin 3 自定義檔案描述符 4 tee命令 1 例如echo命令就是將指定的字串送到標準輸出,那麼我們就可以結合echo命令將指定字串傳送到指定的檔案 在這裡就是將檔案描述符stdout 1 的內容通過重定向操作符重定向到了test.tx...