C++: system(0) Возвращает 0
Когда я вызываю system(0), он возвращает 0, что означает, что shell недоступен.
Когда команда, использующая систему (вызывает gcc для компиляции программы hello world), она работает просто отлично, но возвращает -1 (я предполагаю, что это та же причина, что и для system(0), возвращающая 0). Что делает его "недоступным" и почему оно все равно работает?
Компилятор: gcc версии 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3)
ОС: Ubuntu 11.10
РЕДАКТИРОВАТЬ
Эррно говорит " Нет дочерних процессов".
Я также скомпилировал другую тестовую программу, которая ничего не делает, но вызывает system(0) и возвращает ненулевое значение. Может ли это быть затронуто Code::Blocks?
РЕДАКТИРОВАТЬ
До сих пор я понял, что system(0) дает сбой только после того, как я запускаю свой первый pthread.
РЕШИТЬ
Я использовал fork в своей ранней реализации одного из этих кусков кода:
signal(SIGCHLD,SIG_IGN);
Я использовал это, чтобы "обращаться" с зомби. Я только что узнал, что это вызвало ошибку.
2 ответа
Это может произойти, если вы игнорируете 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 при ошибке (например, не удалось выполнить fork(2)), а в противном случае возвращается статус команды. Последний статус возврата имеет формат, указанный в wait(2). Таким образом, код выхода команды будет WEXITSTATUS(статус). В случае, если / bin / sh не может быть выполнено, статусом выхода будет статус команды, которая завершает работу (127). Если значение команды равно NULL, system() возвращает ненулевое значение, если оболочка доступна, и ноль, если нет.
Если у вас нет sh
на вашем пути или не исполняемый файл не доступен. Проверьте свою конфигурацию.
Если система возвращает -1, может быть проблема с выполнением fork
так что проверьте errno
значение переменной или, возможно, статус возврата вызванной команды, который также может быть -1. Проверьте статус выхода вашей команды, выполненной из chell.