當一個進程運行時,會有相應的文件描述符(Linux一切皆文件),一般會有3個默認的文件描述符:
0:與標準輸入關聯
1:與標準輸出關聯
2:與標準錯誤輸出關聯
dup\dup2函數,對文件描述符重定向
close(1);//關閉要重定向的文件描述符
dup(fd,1);//將標準輸出重定向到打開的文件
dup2(fd,1);//將打開的文件fd複製到標準輸出1
代碼:
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
static void Use(const char* proc)
{
printf("%s [server_ip] [server_port]\n",proc);
}
int main(int argc,char* argv[])
{
if(argc!=3)
{
Use(argv[0]);
return 1;
}
int sock = socket(AF_INET,SOCK_STREAM,0);
if(sock<0)
{
perror("socket");
return 2;
}
close(1);
dup(sock);
//dup2(sock,1);
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]);
if(connect(sock,(struct sockaddr*)&peer,sizeof(peer))<0)
{
perror("connect");
return 3;
}
char buf[1024];
while(1)
{
printf("please enter#");
fflush(stdout);
close(1);
dup2(sock,1);
ssize_t s = read(0,buf,sizeof(buf)-1);
if(s>0)
{
buf[s-1]=0;
write(sock,buf,strlen(buf));
ssize_t _s = read(sock,buf,sizeof(buf)-1);
if(_s>0)
{
buf[_s]=0;
printf("server echo#%s\n",buf);
}
}
}
close(sock);
return 0;
}