pclose () не даст мне код завершения процесса - PullRequest
0 голосов
/ 18 октября 2018

У меня здесь странная проблема.

Я написал некоторый код 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.Итак, как я могу вызвать внешние процессы и надежно получить их коды выхода?

1 Ответ

0 голосов
/ 18 октября 2018

pclose() никогда не возвращает реальный код выхода из дочернего процесса.

pclose скорее возвращает значение параметра stat_loc для вызова wait().

Inслучаи, когда waitpid() с идентификатором дочернего процесса возвращает -1, pclose() также возвращает -1.

Это может произойти, если вы нарушили код в других потоках, ожидающих произвольного дочернего элементапроцессы, а не только ожидание самостоятельно созданных дочерних процессов.

...