Python — Stdin и stdout для канала неверны после использования dup2 () для копирования в канал

Мне кажется, что моя труба работает со сбоями (хотя я знаю, что делаю что-то не так). Моя программа ‘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’.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]