У меня здесь странная проблема.
Я написал некоторый код C ++ с использованием popen(3)
, read(3)
и pclose(3)
для запуска различных команд оболочки, анализа их вывода и выполнения некоторых другихвещи.Программа, кажется, работает хорошо.
Затем я извлек часть кода в общую библиотеку и попытался использовать его из программы на C #, работающей под Mono.Теперь код C ++ вообще не работает.
При запуске кода в GDB кажется, что pclose(3)
всегда безусловно возвращает -1, а не real код завершения дочернего процесса.
Наблюдая за strace
, кажется, что wait4(2)
завершается неудачно с ECHILD
.И, насколько я могу судить, это происходит потому, что SIGCHLD
доставляется в один из других потоков Mono, который быстро выполняет несколько вызовов wait4(2)
, а затем продолжает свой день.
ВыполнениеПохоже, что при поиске в Google ядро произвольно выбирает поток для отправки SIGCHLD
(Другими словами, в многопоточной программе гарантированно всегда выбирают "неправильный" поток.)
Очевидно, что я не контролирую, что решает делать среда выполнения Mono.Итак, как я могу вызвать внешние процессы и надежно получить их коды выхода?