创建我自己的重定向和重复管道功能

时间:2015-07-16 14:39:41

标签: c pipe

我正在制作一个小shell,我的两个函数遇到了一些问题。 它们有点脱离背景,但我希望你能理解我想要做的事情,所以我不必发布我的整个代码。

我的dupPipe功能: 我想将管道复制到std I / O文件描述符并关闭两个管道末端。它看起来像这样:int dupPipe(int pip[2], int end, int destinfd);。 where end告诉哪个管道要复制,READ_END或WRITE_END和destinfd告诉要替换哪个std I / O文件描述符。

我的重定向功能: 它应该将std I / O文件描述符重定向到文件。 它看起来像这样int redirect(char *file, int flag, int destinfd);。 其中flag表示是否应该读取或写入文件,destinfd是我要重定向的std I / O文件描述符。

我做了什么:

int dupPipe(int pip[2], int end, int destinfd)
{
if(end == READ_END)
{
    dup2(pip[0], destinfd);
    close(pip[0]);
}
else if(end == WRITE_END)
{
    dup2(pip[1], destinfd);
    close(pip[1]);
}
return destinfd;
}

第二功能:

int redirect(char *filename, int flags, int destinfd)
{
if(flags == 0)
{
    return destinfd;
}
else if(flags == 1)
{
    FILE *f = fopen(filename, "w");
    if(! f)
    {
        perror(filename);
        return -1;
    }
}
else if(flags == 2)
{
    FILE *f = fopen(filename, "r");
    if(! f)
    {
        perror(filename);
        return -1;
    }
}
return destinfd;
}

我感谢任何给予的帮助,我做错了什么或者没有完成我写的想要的功能?感谢。

1 个答案:

答案 0 :(得分:0)

redirect功能似乎没有做你想要的。您正在使用fopen打开文件,但不会以任何方式将其链接到destinfd。您可能希望使用open,然后使用dup2将文件描述符移动到您想要的位置。

int redirect(char *filename, int flags, int destinfd)
{
    int newfd;

    if(flags == 0) {
        return -1;
    } else if(flags == 1) {
        newfd = open(filename, O_WRONLY);
        if (newfd == -1) {
            perror("open for write failed");
            return -1;
        }
    } else if(flags == 2) {
        newfd = open(filename, O_RDONLY);
        if (newfd == -1) {
            perror("open for read failed");
            return -1;
        }
    } else {
        return -1;
    }
    if (dup2(newfd, destinfd) == -1) {
        perror("dup2 failed");
        close(newfd);
        return -1;
    }
    close(newfd);
    return destinfd;
}