Хрестоматия по программированию на Си в Unix



Системные вызовы и взаимодействие с UNIX. Хрестоматия по программированию на Си в Unix - стр. 7


6.5.4. Завершить процесс можно системным вызовом

void exit( unsigned char retcode );

Из этого вызова не бывает возврата. Процесс завершается: сегменты stack, data, text, user уничтожаются (при этом все открытые процессом файлы закрываются); память, которую они занимали, считается свободной и в нее может быть помещен другой процесс. Причина смерти отмечается в паспорте процесса - в структуре proc в таблице процессов внутри ядра. Но паспорт еще не уничтожается! Это состояние процесса называется "зомби" - живой мертвец.

В паспорт процесса заносится код ответа retcode. Этот код может быть прочитан процессом-родителем (тем, кто создал этот процесс вызовом fork). Принято, что код 0 означает успешное завершение процесса, а любое положительное значение 1..255 означает неудачное завершение с таким кодом ошибки. Коды ошибок заранее не предопределены: это личное дело процессов отца и сына - установить между собой какие-то соглашения по этому поводу. В старых программах иногда писалось exit(-1); Это некорректно - код ответа должен быть неотрицателен; код -1 превращается в код 255. Часто используется конструкция exit(errno);

Программа может завершиться не только явно вызывая exit, но и еще двумя способами:

  • если происходит возврат управления из функции main(), т.е. она кончилась - то вызов exit() делается неявно, но с непредсказуемым значением retcode;
  • процесс может быть убит сигналом. В этом случае он не выдает никакого кода ответа в процесс-родитель, а выдает признак "процесс убит".

6.5.5. В действительности exit() - это еще не сам системный вызов завершения, а стандартная функция. Сам системный вызов называется _exit(). Мы можем переопределить функцию exit() так, чтобы по окончании программы происходили некоторые действия:

void exit(unsigned code){ /* Добавленный мной дополнительный оператор: */ printf("Закончить работу, " "код ответа=%u\n", code);

/* Стандартные операторы: */ _cleanup(); /* закрыть все открытые файлы. * Это стандартная функция */ _exit(code); /* собственно сисвызов */ }




Содержание  Назад  Вперед