使用dup2()复制到管道后,标准输入和标准输出管道错误

2024-06-28 11:35:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我的管道似乎出了故障(尽管我知道我做错了什么)。我的程序'A1.py'需要来自管道'toA1'的输入,它会处理输入并通过管道'toA2'将输出发送到'A2.cpp'。
“A2.cpp”需要从管道“toA2”输入,并将其输出发送到屏幕(默认标准输出)。你知道吗

一旦'A2.cpp'通过execv()运行,它仍然从用户那里获取输入(当它应该从管道'toA2'获取输入时)。第二个fork中的变量“use\u input”说明了这一点。当下列行运行时:

std::cout << use_input << std::endl; 

程序打印到“blank”屏幕上,这是变量“use\u input”中的内容。你知道吗

我不确定到底出了什么问题,因为A1.py可以正常工作(管道'toA1'可以正常工作,不确定输出到管道'toA2'是否正常。
我用1.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等待用户输入“getline(std::cin,user_input);”。这会将其传递到A2.cpp,如“std::cin>;>use\u input;”所示
有时从A1到A2的管道打开,A1产生的所有输出突然涌入…A2.cpp将所有输出都输出到屏幕上,而它应该每5秒输出一次数据,因为它每5秒提供一次数据 我不太清楚这里的错误是什么,但我已经有几天没弄清楚了。我想A2.cpp在切换输入时应该只从管道'toA2'获取输入。你知道吗


Tags: pychilda2closeinput管道usea1