C ++: system (0) Возвращает 0 - PullRequest
       24

C ++: system (0) Возвращает 0

2 голосов
/ 31 января 2012

Когда я вызываю system (0) , возвращается 0, что означает, что оболочка недоступна .

Когда команда, использующая system (вызывает gcc для компиляции программы hello world), работает нормально, но возвращает -1 (я полагаю, это та же причина, что и для system (0) возвращает 0). Что делает его «недоступным» и почему оно все равно работает?

Компилятор: gcc версии 4.6.1 (Ubuntu / Linaro 4.6.1-9ubuntu3)

ОС: Ubuntu 11.10

EDIT

Errno говорит Нет дочерних процессов .

Я также скомпилировал другую тестовую программу, которая ничего не делает, но вызывает system (0) и возвращает ненулевое значение. Может ли это быть затронуто Code :: Blocks?

EDIT

До сих пор я выяснил, что system (0) дает сбой только после того, как я запускаю свой первый pthread.

решаемые

Я использовал fork в моей ранней реализации одного из этих фрагментов кода:

signal(SIGCHLD,SIG_IGN);

Я использовал его для "обработки" зомби. Я только что узнал, что это вызвало ошибку.

Ответы [ 2 ]

3 голосов
/ 31 января 2012

Это может произойти, если вы игнорируете сигнал SIGCHLD, используя такой код:

signal(SIGCHLD, SIG_IGN);

Это приведет к тому, что system вернет -1, когда все дочерние элементы закончатся, установив errno вECHILD.

См. http://pubs.opengroup.org/onlinepubs/009695399/functions/wait.html. В частности:

Если в вызывающем процессе установлено SA_NOCLDWAIT или для SIGCHLD установлено значение SIG_IGN, а в процессе нет ожидающихдля дочерних элементов, которые были преобразованы в процессы-зомби, вызывающий поток должен блокироваться до тех пор, пока не завершатся все дочерние элементы процесса, содержащего вызывающий поток, а wait () и waitpid () завершатся с ошибкой и установят для errno значение [ECHILD].

1 голос
/ 31 января 2012

Человек говорит:

Возвращаемое значение равно -1 при ошибке (например, ошибка fork (2)), а в противном случае возвращается статус команды. Последний статус возврата имеет формат, указанный в wait (2). Таким образом, код выхода команды будет WEXITSTATUS (статус). В случае, если / bin / sh не может быть выполнено, статусом выхода будет статус команды, которая завершает работу (127). Если значение команды равно NULL, system () возвращает ненулевое значение, если оболочка доступна, и ноль, если нет.

Если у вас нет sh на вашем пути или вы не можете выполнить исполняемый файл, он недоступен. Проверьте свою конфигурацию.

Если система возвращает -1, может быть проблема с выполнением fork, поэтому проверьте errno значение переменной или, возможно, состояние возврата вызванной команды, которое также может быть -1. Проверьте статус выхода вашей команды, выполненной из chell.

...