我尝试将父进程的标准输入转移到子进程。
stdin - > parentprocess - > child_eingabe [1] - > child_eingabe [0] - >子进程 - >标准输入
我的小程序以这种方式工作,我可以将父进程中的东西写入管道(使用write()命令),并通过stdin到达我的孩子。什么不行,是父母的标准输入直接写入管道。这有效吗?
#include <iostream>
#include <string>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
int main(int argc, char *argv[])
{
// string to the client
string sClient = "/tmp/myecho";
int child_eingabe[2];
cout << "Creating pipes " << endl;
if(pipe(child_eingabe) < 0) {
cout << " Error in pipe " << endl;
}
// forking now
pid_t pid;
cout << "Forking process" << endl;
if((pid = fork()) == 0) {
close(child_eingabe[1]);
int fid = -1;
if(fid=dup2(child_eingabe[0], 0) < 0)
cout << "Could not redirect STDIN" << endl;
close(child_eingabe[0]);
int result = execve(sClient.c_str(),0,0);
cout << "something went wrong while starting client" << endl;
if (result != 0) {
cout << "Could not start" << endl;
}
exit(0);
}
close(child_eingabe[0]);
// if(dup2(0,child_eingabe[1]) < 0)
if(dup2(child_eingabe[1],0) < 0)
cout << "Could not redirect STDIN" << endl;
close(0);
while(1)
{
sleep(1);
}
return 0;
}
如果我看到一切正确,那么父部分中的第二个dup2并不是我所期望的。
答案 0 :(得分:2)
为什么要将父stdin重定向到管道?据我了解,这正是你想要避免的。删除第二个dup2并关闭(0)应该为您的父项提供一个与管道完全断开连接的标准输入。
编辑:澄清问题后 - 想要将数据从父stdin复制到子stdin。
像你一样创建子管道,然后手动读取父级中的stdin,并将数据传递给write()
上child_eingabe[1]
的孩子
答案 1 :(得分:0)
您确实需要输入转到父进程吗?
如果没有,您可以关闭父项的stdin,而不是所有输入都转到子进程。
否则,最简单的方法应该是Erik所写的。
其他方式(如果它适用于你的情况,不是shure),应该将孩子的stdin和父母的stdout重定向到管道。你的父母读取输入并将其写入stdout(孩子的输入)。