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...