#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 только считывает файл.