Мне кажется, что моя труба работает со сбоями (хотя я знаю, что делаю что-то не так). Моя программа ‘A1.py’ требует ввода из канала ‘toA1’, который он получает нормально, обрабатывает ввод и отправляет свой вывод в ‘A2.cpp’ через канал ‘toA2’.
«A2.cpp» требует ввода из канала «toA2» и отправляет свой вывод на экран (стандартный вывод).
Когда A2.cpp запущен через execv (), он по-прежнему принимает ввод от пользователя (когда он должен брать его из канала ‘toA2’. Это демонстрируется переменной ‘use_input’ во втором форке. Когда следующее линия проходит:
std::cout << use_input << std::endl;
программа выводит на экран «пробел», что было в переменной «use_input».
Я не совсем уверен, что происходит неправильно, поскольку он хорошо работает для A1.py (канал ‘toA1’ работает нормально, не уверен, что вывод в канал ‘toA2’ в порядке.
Я отправляю на стандартный вывод в A1.py с помощью sys.stdout.write ().
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_input;»
Иногда канал от А1 до А2 открывается, и весь вывод, который производил А1, внезапно затопляется … и A2.cpp выводит все это на экран, когда вместо этого он должен выводить данные каждые ~ 5 секунд, так как он получает данные один раз каждые ~ 5 секунд
Не совсем уверен, в чем здесь ошибка, но я не смог ее выяснить уже несколько дней. Я полагаю, что A2.cpp переключает входы, когда он должен принимать данные только из канала ‘toA2’.
Задача ещё не решена.
Других решений пока нет …