使用dup/dup2進行文件描述符重定向

當一個進程運行時,會有相應的文件描述符(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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章