使用 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 (将#修改为@)