微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 dup2()

如何解决使用 dup2()

在执行 shell 程序时,我遇到了其中一个函数的问题。按比例缩小,它与内置函数的标准输入重定向有关。特别是,我正在实现一个内置函数来“暂停”系统,直到用户点击进入。由于这是从标准输入获取输入,如果我之前使用 dup2() 将标准输入重定向到另一个文件,它应该能够工作。我已经能够毫无问题地重定向 stdin 并从输入文件中读取,但我遇到的问题是在我“清理”并将 stdin 重置回其初始状态之后,我用 dup() 保存了该状态。>

问题不在于要重置的 dup2() 失败,因为我在较大的程序实现中有其他功能,它们以完全相同的方式重置 stdin 和 stdout,并且能够在此之后从 getline() 检索输入.

以下是我归结为一小部分的问题。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>

int main(int argc,char ** argv){

    char *input = NULL;
    size_t len = 0;
    int init; 
    int fd;

    getline(&input,&len,stdin);
    input = strtok(input,"\n");

    if((fd = open(input,O_RDONLY)) == -1){
        printf("error opening file\n");
    }
    if((init = dup(STDIN_FILENO)) == -1){
        printf("error duping initial stdin\n");
    }

    if(dup2(fd,STDIN_FILENO) == -1){
       printf("error duping fd\n");
    }
    close(fd);

    while(getline(&input,stdin) != -1){
        printf("%s\n",input);
    }

    close(0);

    if(dup2(init,STDIN_FILENO) == -1){
       printf("error!\n");
    }

    getline(&input,stdin);
    printf("%s\n",input);

    return 0;
}

这是我一直传递给程序的文本文件文件内容

cd ..
echo 3207
touch test.txt
ls -la | grep test
cat < test.txt > out.txt
ls -l >> test.txt

它应该在打印这些行后从键盘读取输入,但它只是再次打印最后一行并退出。任何建议表示赞赏!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。