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.

Другие вопросы по тегам