【问题标题】:Segmentation fault (core dumped) Redirecting input分段错误(核心转储)重定向输入
【发布时间】:2018-06-09 04:02:35
【问题描述】:

对于我的程序,我已经完成了函数

void clear_forward() {
    if (saved_stdout) {
        dup2(saved_stdout, 1);
        if (close(saved_stdout))
            saved_stdout = 0;
    }
    if (saved_stdin) {
        dup2(saved_stdin, 0);
        if (close(saved_stdin))
            saved_stdin = 0;
    }
    if (saved_stderr) {
        dup2(saved_stderr, 2);
        if (close(saved_stderr))
            saved_stderr = 0;
    }
}

void forward() {
    int fd_out, fd_in, fd_err;
    if (!saved_stdout) {
        saved_stdout = dup(1);
    }
    if (!saved_stdin) {
        saved_stdout = dup(0);
    }
    if (!saved_stderr) {
        saved_stderr = dup(2);
    }
    if (strcmp(out_file.c_str(), "") != 0) {
        if ((saved_stdout < 0)) {
            fprintf(stderr, "Can't dup(2) - (%s)\n", strerror(errno));
            exit(1);
        }
        if ((fd_out = open(out_file.c_str(), O_RDWR | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR)) < 0) {
            fprintf(stderr, "Can't open(2) - (%s)\n", strerror(errno));
            exit(1);
        }
        if (dup2(fd_out, 1) < 0) // redirect output to the file
        {
            fprintf(stderr, "Can't dup2(2) - (%s)\n", strerror(errno));
            exit(1);
        }
        close(fd_out);  // Descriptor no longer needed
    }

    if (strcmp(inp_file.c_str(), "") != 0) {
        if ((saved_stdout < 0)) {
            fprintf(stderr, "Can't dup(2) - (%s)\n", strerror(errno));
            exit(1);
        }
        if ((fd_in = open(inp_file.c_str(), O_RDWR | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR)) < 0) {
            fprintf(stderr, "Can't open(2) - (%s)\n", strerror(errno));
            exit(1);
        }
        if (dup2(fd_in, 0) < 0) // redirect input from file
        {
            fprintf(stderr, "Can't dup2(2) - (%s)\n", strerror(errno));
            exit(1);
        }
        close(fd_in);  // Descriptor no longer needed

    }
    if (strcmp(err_file.c_str(), "") != 0) {
        if (saved_stderr < 0) {
            fprintf(stderr, "Can't dup(2) - (%s)\n", strerror(errno));
            exit(1);
        }
        if ((fd_err = open(err_file.c_str(), O_RDWR | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR)) < 0) {
            fprintf(stderr, "Can't open(2) - (%s)\n", strerror(errno));
            exit(1);
        }

        if (dup2(fd_err, 2) < 0) // redirect input from file
        {
            fprintf(stderr, "Can't dup2(2) - (%s)\n", strerror(errno));
            exit(1);
        }
        close(fd_err);  // Descriptor no longer needed
    }
}

所以在我运行之后,我希望重定向工作。但只能重定向到文件,而不是从文件中获取输入。可能是什么问题?:

int run(string arguments){
    clear_forward();
    vector<string> parsed_args = parse_args(std::move(arguments));
    if (parsed_args.size()==2 && !strcmp(parsed_args[0].c_str(), ".")) {
        string line;
        std::ifstream infile(parsed_args[1]);
        while (std::getline(infile, line)) {
            if (! line.empty()) {
                run(line, fd);
            } else { continue; }
            add_history(line.c_str());
        }
    }
    if(parsed_args.empty()){
        return 0;
    }

    forward();
    if(is_internal(parsed_args)){
        return run_internal(parsed_args);

    } else
        return execute(parsed_args);
}

我应该如何执行此操作? Execute 只是从解析的 args 中分叉 exec,我应该如何将文件中的输入添加到其中?如果有输入文件,手动从 STDIN 读取??

【问题讨论】:

  • 使用调试器逐步完成。找到出错的确切代码行。贴出相关的代码行。 那我们再说吧。

标签: c++ pipe dup2


【解决方案1】:

在您的forward() 函数中:

if (!saved_stdin) {
    saved_stdout = dup(0);
}

您可能不想检查saved_stdin,然后将stdin复制到saved_stdout

你的意思可能是:

if (!saved_stdin) {
    saved_stdin = dup(0);
}

【讨论】:

    猜你喜欢
    • 2015-06-25
    • 2021-06-03
    相关资源
    最近更新 更多