我的管道在我看来是发生故障的(尽管我知道我做错了什么)。我的节目' A1.py'需要输入来自管道的A1和#1;它变得很好,它处理输入并将其输出发送到' A2.cpp'通过管道到A2'。
' A2.cpp'需要从管道输入到A2和#39;并将其输出发送到屏幕(默认标准输出)。
一次' A2.cpp'正在通过execv()运行,它仍然需要来自用户的输入(当它应该从管道'到A2'。这由变量' use_input'在第二个叉子中展示。当以下行运行时:
std::cout << use_input << std::endl;
程序打印到屏幕&#34;空白&#34;,这是变量&#34; use_input&#34;。
我不确定出了什么问题,因为它适用于A1.py(管道&#39;到A1&#39;工作正常,不确定它是否输出到管道&# 39; toA2&#39;很好
我使用&#39; sys.stdout.write()&#39;发送到A1.py中的stdout。
A3.cpp:
int main(int argc, char **argv) {
pid_t child_pid;
char* empty_arg1[2];
empty_arg1[0] = "A1.py";
empty_arg1[1] = nullptr;
char* empty_arg2[2];
empty_arg2[0] = "A2";
empty_arg2[1] = nullptr;
int toA1[2]; int toA2[2]; pipe(toA1); pipe(toA2);
child_pid = fork();
if (child_pid == 0) {
dup2(toA1[0], STDIN_FILENO); //A1 gets stdin from pipe 'toA1'
close(toA1[0]);
close(toA1[1]);
dup2(toA2[1], STDOUT_FILENO); //sends stdout to pipe 'toA2'
close(toA2[0]);
close(toA2[1]);
return execvp("./A1.py", empty_arg1);
}
child_pid = fork();
if (child_pid == 0) {
std::string use_input = "blank";
dup2(toA2[0], STDIN_FILENO); //A2 gets stdin from pipe 'toA2'
close(toA2[0]);
close(toA2[1]);
std::cout << "use_input[1] = " << use_input << std::endl;
return execv("./A2", empty_arg2);
}
dup2(toA2[1], STDOUT_FILENO); //Sends output to 'toA2'
close(toA2[0]);
close(toA2[1]);
while (!std::cin.eof()) {
getline(std::cin, user_input);
std::cout << user_input << std::endl;
}
return 0;
}
A1.py:
def main():
.....
sys.stdout.write("V " + str(len(vertex_list)) + "\n")
sys.stdout.write(str_edges + "\n")
if __name__ == '__main__':
main()
在A2.cpp内部,文件的开头是:
std::string use_input = "NOPE";
std::cerr << "A2 is running" << std::endl;
std::cin >> use_input;
std::cout << "use_input[2] = " << use_input << std::endl;
当我运行我的驱动程序A3.cpp时,A3.cpp等待用户输入&#34; getline(std :: cin,user_input);&#34;。这将它传递给A2.cpp,如#34; std :: cin&gt;&gt;所示。 use_input;&#34;
有时从A1到A2的管道打开,A1生产的所有输出突然泛滥......并且A2.cpp将它全部输出到屏幕上,相反它应该每次都输出数据〜 5秒,因为它每5秒钟给出一次数据
不确定这里的错误是什么,但我现在几天都无法弄明白。我想某种方式A2.cpp正在切换输入,它只应该从管道输入到#2;#/ p>。