Коды возврата завершившихся процессов
Сей
Код:
#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;
}
#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 записываются вовсе не те коды возврата, которые ожидаются?
потому что как минимум блок в if нужен
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
Спасибо, разобрался.