UNIX环境高级编程 习题3.2 编写一个与3.12节中dup2功能相同的函数,要求不调用fcntl函数,并且要有正确的出错处理。

参考文章:https://blog.csdn.net/andylfg/article/details/41683391

UNIX环境高级编程 chapter3

3.2 编写一个与3.12节中dup2功能相同的函数,要求不调用fcntl函数,并且要有正确的出错处理。

不断的利用dup复制原有文件描述符,直至产生有一个文件描述符与传入的第二个参数相等时停止。然后将前面那些文件描述符关闭,返回第二个参数的文件描述符。

#include "../../apue.3e/include/apue.h"
#include <unistd.h>
#define BUFFSIZE 40
typedef struct fdlist{
    int myFd;
    struct fdlist *next;
}FD_LIST;

int mydup2(int fd, int fd2);

int main(void)
{
    int fdin;
    int fdout;
    int n;

    char buf[BUFFSIZE];
    fdin = mydup2(STDIN_FILENO,4);
    fdout = mydup2(STDOUT_FILENO, 5);

    printf("STDIN fd %d\n",fdin);
    printf("STDOUT fd %d\n",fdout);

    while ((n = read(fdin,buf,BUFFSIZE)) > 0)
    {
        if(write(fdout,buf,n) != n)
            err_sys("write error\n");
    }
    if(n < 0)
        err_sys("read error\n");
    exit(0);
}

int mydup2(int fd, int fd2)
{
    FD_LIST *fdNode = NULL,*p = NULL;
    int newfd;

    close(fd2);

    while ((newfd = dup(fd)) != fd2)
    {
        fdNode = (FD_LIST*) malloc(sizeof(FD_LIST));
        fdNode->myFd = newfd;
        fdNode->next = p;
        p = fdNode;
    }

    while (p!=NULL)
    {
        fdNode = p;
        close(fdNode->myFd);
        p = p->next;
        free(fdNode);
    }
    return newfd;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值