Разветвление, родительский, дочерний процесс и бесконечный цикл

#c #linux #fork

#c #linux #форк

Вопрос:

Я пытаюсь создать программу на C , которая вычисляет некоторые значения в симуляции, а затем передает выходные данные в скрипт Python для рисования. Оба процесса работают в бесконечном цикле, программа на C вычисляет этапы моделирования и передает их программе Python через канал, программа Python повторно считывает данные из канала и отображает данные.

До сих пор я пытался добиться этого, разветвляя текущий процесс и выполняя скрипт Python в дочернем процессе, однако, когда я запускаю бесконечный цикл в родительском процессе, он блокирует все операции ввода-вывода, и на экран ничего не выводится, пока я не завершу родительский процесс и не превращу дочерний процесс в зомби. Программа на C , которая запускает скрипт, выглядит следующим образом:

 int main(int argc, char* argv[]) {
    int pipe_to_py[2];

    if (::pipe(pipe_to_py)) {
        std::cout << "Failed to open pipe for uni-directional communication";
    }
    pid_t pid = fork();

    // if pid is the child process then start up the python script and pass the file descriptors over to it
    if (pid == 0) {
        ::close(pipe_to_py[1]); // close the "write end"
        std::ostringstream oss;

        oss << "export PY_READ_FD=" << std::to_string(pipe_to_py[0])  << " amp;amp; "
            << "export PYTHONUNBUFFERED=true amp;amp; "
            << "python3 script.py";
        ::system(oss.str().c_str()); // call py script
    } else if (pid < 0) { exit(1);
    } else {
        ::close(pipe_to_py[0]);
        program_loop(amp;pipe_to_py[1]); // function with while(true) loop
    }

    return 0;
}
 

В то время как сценарий Python:

 # the physical animation function draws data from the pipe and plots it
def animate(i):
    data = read_data_from_pipe()
    draw(data)
  

anim = FuncAnimation(fig, animate, interval=100)
fig.show()
plt.show()
 

Мне просто интересно, что именно я делаю не так и почему ввод-вывод блокируется для дочернего процесса.

Комментарии:

1. Желаемое решение является сложным и приятным. Обычно я ненавижу такие ответы / комментарии, не отвечающие на вопрос: ленивым решением было бы записать выходные данные в файл и запустить два независимых процесса. C записывает результаты в файл, перезаписывая прежнее содержимое. Если вы хотите заблокировать файл во время записи, вы можете использовать блокировку файла boost . Это позволяет другим процессам читать файл, даже если он заблокирован. [ boost.org/doc/libs/1_74_0/doc/html/interprocess /. … И python только считывает файл.