Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Коды возврата завершившихся процессов

56K
10 октября 2011 года
bum-bayan
16 / / 04.07.2010
Доброго времени суток.

Сей
Код:
#include <stdio.h>
#include <unistd.h>

int main()
{
   int i, pid, status, w;
   for (i=0; i<3; ++i)
   {
      pid = fork();

      if (pid == 0)
      {
             printf("Child pid = %d\n", getpid());
             exit(getpid() + i);
       }
   }

   while ( (w = wait(&status)) != -1)
      printf ("Child %d status %d\n", w, status);

   return 0;
}


... дает следующий вывод:
Child pid = 2036
Child pid = 2037
Child pid = 2038
Child 2037 status 62976
Child 2038 status 63488
Child 2036 status 62464

Почему в переменную status записываются вовсе не те коды возврата, которые ожидаются?
14
10 октября 2011 года
Phodopus
3.3K / / 19.06.2008
потому что как минимум блок в if нужен
360
10 октября 2011 года
P*t*
474 / / 15.02.2007
status - это не код возврата.
status содержит информацию о том, из за чего завершился процесс.
Код возврата вроде бы содержится во втором байте статуса.

[QUOTE="man wait"] Если status не равен NULL, то функции wait и waitpid сохраняют информацию о статусе в переменной, на которую указывает status.
Этот статус можно исследовать с помощью нижеследующих макросов (они принимают в качестве аргумента буфер (типа int), — а не указатель на буфер!):
WIFEXITED(status)
не равно нулю, если дочерний процесс нормально завершился.
WEXITSTATUS(status)
возвращает восемь младших битов возвращаемого значения завершившегося дочернего процесса. Эти биты могли быть установлены в аргументе
функции exit() или в аргументе оператора return в функции main(). Этот макрос можно использовать, только если WIFEXITED вернул ненулевое
значение.
[/QUOTE]

Так что можно написать printf ("Child %d status %d\n", w, WEXITSTATUS(status)); , но ответ получится по модулю 256
56K
11 октября 2011 года
bum-bayan
16 / / 04.07.2010
Спасибо, разобрался.

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог