c++ - c shell 输入重定向保持打开状态

标签 c++ shell stdout stdin io-redirection

我正在使用以下代码部分为我的自定义 C++ shell 执行输入重定向。 虽然与此类似的输出重定向运行良好,但输入重定向的子进程保持打开状态并且不会返回,就像它一直在等待新输入一样。 “询问”或“强制”这样的子进程在读取输入后立即返回的最佳方法是什么?

输入重定向代码

int in_file = open(in, O_CREAT | O_RDONLY , S_IREAD | S_IWRITE);
pid_t pid = fork();
    if (!pid) {
         dup2(in_file, STDIN_FILENO);
         if (execvp(argv[0], argv) < 0) {
             cerr << "*** ERROR: exec failed: "<< argv[0] << endl;
             exit(EXIT_FAILURE);
         }
     }
close(in_file);

输出重定向代码

out_file = open(out, O_CREAT | O_WRONLY | O_TRUNC, S_IRWXU);
pid_t pid = fork();
    if (!pid) {
         dup2(out_file, STDOUT_FILENO);
         if (execvp(argv[0], argv) < 0) {
             cerr << "*** ERROR: exec failed: "<< argv[0] << endl;
             exit(EXIT_FAILURE);
          }
    }    
close(out_file);

我使用以下命令进行测试:

ps aux > out.txt
grep root < out.txt

第一个命令在成功写入 out.txt 后返回到 shell。第二个命令从 out.txt 中读取成功,但没有返回或停止。

最佳答案

child 仍然打开了 in_file。你必须在执行之前关闭它:

dup2(in_file, STDIN_FILENO);
close(in_file);

(为简洁起见省略了错误检查)。因为 child 仍然有一个打开的文件描述符,它永远不会看到文件被关闭,所以它阻塞在读取等待某人写入更多数据。子进程没有意识到它是打开文件描述符的进程。另一种选择是设置 'close-on-exec'文件描述符的标志,以便它在执行时自动关闭。 (搜索 FD_CLOEXEC)

关于c++ - c shell 输入重定向保持打开状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16997606/

相关文章:

Python:如何从另一个进程非阻塞地读取标准输出?

C++类原型(prototype)冲突

c++ - 使用错误的 "this"指针调用构造函数。这是堆栈损坏吗?

c++ - C 和 C++ 中 void 指针的区别

c - 在 c 中使用管道和 I\O 重定向的 Shell 实现

Bash 脚本手动运行,但在 crontab 上失败

c++ - Objective C 协议(protocol)引用作为 C++ 类中的实例变量

Bash:将属性文件读入数组

elixir - 如何在 Elixir 中测试多行输出?

pipe - 重定向后缀命令管道的输出