分段错误(核心转储) 重定向输入
Segmentation fault (core dumped) Redirecting input
对于我的程序,我已经完成了函数
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);
}
我应该如何执行此操作?执行只是从解析的参数中分叉可执行文件,我应该如何将文件中的输入添加到其中?如果有输入文件,请从 STDIN 手动读取?
在forward()
函数中:
if (!saved_stdin) {
saved_stdout = dup(0);
}
您可能不想检查saved_stdin
然后将stdin
复制到saved_stdout
。
您可能的意思是:
if (!saved_stdin) {
saved_stdin = dup(0);
}
相关文章:
- 编写时C++中的输入重定向问题
- 获取通过重定向传入的输入文件的名称?
- 使用 dup2() 进行输入重定向
- 重定向输入和输出时如何处理主文件I/O?
- 使用重定向命令从 stdin 读入的字符串"<"输入文件未正确附加
- 当使用带有stdin和stdout重定向的双进程管道时,如何避免stdin上的重复输入
- 将两个独立的stdin重定向为程序的输入
- 分段错误(核心转储) 重定向输入
- 如何将输入重定向与特殊整数作为分隔线和直至EOF
- 即使可执行文件的输入是从文件重定向的,如何强制从终端输入?
- 输入重定向读取整数和char C
- 将线程之间的标准输入/输出重定向
- C++输入重定向导致文件参数工作时出错
- 如何从Windows CMD运行可执行文件并将其传递给文件输入的参数参数和重定向
- 如何在 c++ 中使用输入重定向添加整数
- 在while循环中使用输入重定向
- C++ - 使用 IO 重定向输入和输出多个整数
- 使用重定向输入和输出的c++进程间通信不适用于发布版本
- 当重定向输入流到字符串时,c++程序核心转储
- 使用stdin重定向输入