使用dup2()复制到管道

时间:2017-11-04 22:57:50

标签: python c++ pipe fork execv

我的管道在我看来是发生故障的(尽管我知道我做错了什么)。我的节目' 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>。

0 个答案:

没有答案