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



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


Процесс регистрации пользователя в системе - /etc/getty (название происходит от "get tty" - получить терминал) - запускается процессом номер 1 - /etc/init-ом - на каждом из терминалов, зарегистрированных в системе, когда

  • система только что была запущена;
  • либо когда пользователь на каком-то терминале вышел из системы (интерпретатор команд завершился).
  • В сильном упрощении getty может быть описан так:

    void main(ac, av) char *av[]; { int f; struct termio tmodes;

    for(f=0; f < NOFILE; f++) close(f);

    /* Отказ от управляющего терминала, * основание новой группы процессов. */ setpgrp();

    /* Первоначальное явное открытие терминала */ /* При этом терминал av[1] станет упр. терминалом */ open( av[1], O_RDONLY ); /* fd = 0 */ open( av[1], O_RDWR ); /* fd = 1 */ f = open( av[1], O_RDWR ); /* fd = 2 */

    // ... Считывание параметров терминала из файла // /etc/gettydefs. Тип требуемых параметров линии // задается меткой, указываемой в av[2]. // Заполнение структуры tmodes требуемыми // значениями ... и установка мод терминала. ioctl (f, TCSETA, &tmodes);

    // ... запрос имени и пароля ...

    chdir (домашний_каталог_пользователя);

    execl ("/bin/csh", "-csh", NULL); /* Запуск интерпретатора команд. Группа процессов, * управл. терминал, дескрипторы 0,1,2 наследуются. */ }

    Здесь последовательные вызовы open занимают последовательные ячейки в таблице открытых процессом файлов (поиск каждой новой незанятой ячейки производится с начала таблицы) - в итоге по дескрипторам 0,1,2 открывается файл-терминал. После этого дескрипторы 0,1,2 наследуются всеми потомками интерпретатора команд. Процесс init запускает по одному процессу getty на каждый терминал, как бы делая

    /etc/getty /dev/tty01 m & /etc/getty /dev/tty02 m & ...

    и ожидает окончания любого из них. После входа пользователя в систему на каком-то терминале, соответствующий getty превращается в интерпретатор команд (pid процесса сохраняется). Как только кто-то из них умрет - init перезапустит getty на соответствующем терминале (все они - его сыновья, поэтому он знает - на каком именно терминале).

    Трубы и FIFO-файлы.




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