当使用带有stdin和stdout重定向的双进程管道时,如何避免stdin上的重复输入
How to avoid duplicate input on stdin when using 2-process pipeline with stdin and stdout redirect
我打算在两个进程之间建立一个管道:父进程和子进程。父进程派生子进程,并使用execve将其映像替换为指定进程的映像。
父级通过std::getline(std::cin,input_line(从stdin读取。孩子通过std::cout<lt;output_line。
我希望设置一个管道,并将子对象的输出重定向到父对象的输入。
问题是父级接收两次每个输入(其中每个输入是子级在stdout上输出的数字(。我想解决这个问题,但我不明白为什么会这样。
代码使用g++7.4.0和C++11标准版本编译。
Child被编译为一个名为"p1"的二进制文件。
父代码:
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <iostream>
char *
const p1argv[] = {
(char * )
"./p1",
nullptr
};
char *
const p1envp[] = {
(char * ) nullptr
};
int main(int argc, char ** argv) {
pid_t p1id;
int p1fd[2];
pipe(p1fd);
if (p1id = fork() == 0) {
close(p1fd[0]);
dup2(p1fd[1], STDOUT_FILENO);
execve(argv[0], p1argv, p1envp);
perror("Error: failed to execve ./p1.");
} else {
dup2(p1fd[0], STDIN_FILENO);
close(p1fd[1]);
std::string line;
while (std::getline(std::cin, line)) {
std::cout << "d(" << line << ")" << std::endl;
}
int status;
waitpid(p1id, & status, 0);
close(p1fd[0]);
}
}
子代码:
#include <iostream>
#include <thread>
int main(int argc, char** argv) {
long it = 0;
while(true) {
it += 1;
std::cout << std::to_string(it) << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(2));
}
}
示例代码的实际输出为:
d(d(1((d(d(2((…
预期输出为:
d(1(d(2(…
问题是这行:
execve(argv[0], p1argv, p1envp);
正在重新执行主父程序,因为这就是argv[0]
此时的内容。我想您想找到一些方法来指定"./p1"
。
相关文章:
- 使用重定向命令从 stdin 读入的字符串"<"输入文件未正确附加
- 当使用带有stdin和stdout重定向的双进程管道时,如何避免stdin上的重复输入
- 将两个独立的stdin重定向为程序的输入
- 如何使用低级系统调用从 stdin 和输入文件中获取字节数
- 检查不作为单个条目的STDIN输入
- 如何将数据写入 stdin,以便由等待来自 stdin 输入的单独线程使用?
- C 程序需要STDIN的输入,但我想从Shell脚本中输送/发送这些输入
- C++以缓冲速率从STDIN读取输入
- 如何从包含空格的 stdin 输入字符串
- 如何获取类似 QIODevice 的控制台输入信号 (stdin)
- 从重定向的stdin获取输入时使用seekg()
- 为什么在 stdin 上输入时"n"而不是从代码输入时显示不同?
- 使用 select() 使用 UDP 套接字从多个对等方接收,同时从 STDIN 获取用户输入
- C++文件分析器/stdin输入-这个算法会起作用吗
- QTextStream stdin读取行未暂停输入
- c++getline似乎无法识别通过管道传输到stdin的输入中的换行符
- 循环以丢弃来自stdin、Linux C++的虚假变量输入
- 在Linux上,在Eclipse CDT中使用gdb调试C++应用程序,以及如何向stdin输入内容
- 将字符数组输入stdin
- 使用stdin重定向输入