КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Иерархия процессов в ОС UNIX. Понятие сеанса. Фоновые процессы.
В качестве узлов в иерарх деревьях выступают сами процессы. А связями будут служить отнош родитель-потомок. Принято разделять на группы процессов или семьи:
Группы вкл 1 или больше процессов и сущ пока сущ хотя бы один процесс в ней. Каждый процесс включается в какую либо группу. При порожд нового процесса он попадает в ту же где и родитель. Процессы могут мигрир из группы в группу. ( по своему жел или по жел других проц) Группы объед в сеансы, образуя кланы семей. С кажд сеансом связан терминал, через него проц общаются с пользователем, у сеанса не мб >1 терминала. Установка идентиф сеанса: Int setsid(void); Примен процессом, кот не явл лидером. Приводит к созданию новой группы, кот будет сост из проц вызвавшего set и он будет лидером. И образуется новый сеанс, идент кот совп с id процесса. При попытке вв/вывода фонового процесса через упр терминал этот процесс получ сигнал, кот привед к прекр раб процесса. Передавать упр терминал может только лидер сеанса. При заверш работы лидера все процессы получают SIGNUP, они завершаются и дальше будут работать только фоновые процессы. Эффективный идентиф пользователя: EUID – пользователь от имени которого процесс пользуется полномочиями. 31.Каналы – средства взаимодействия процессов. Неименованные каналы. Организация конвейера (пример программы). Канал – объект ядра, предст собой ср-во однонапр передачи данных. Канал имеет 2 конца – один для записи, другой для чтения. С кажд концом связан файловый дескриптор. Неименованный канал: Int pipe(int fd[2]); Единственный способ подкл к одному из концов – создать копию процесса. Исп неим канал могут только родств проги. Далее родительский процесс закрывает свой экземпляр дескриптора, в перв доч процессе закрывают для чтен, во втором для записи. В системе присутств откр деск обоих концов канала: при попытке чтения из канала в кот никто не писал читающий проц будет заблок пока туда кто нить не запишет. Либо все деск на запись окажутся закрытыми. Если канал дост только для чтения: тогда read вернет управление немедленно. Попытка записи в канал, из которого никто не читает: пока не заполнится внутр буфер (4кб), после очередного write Заблок процесс пока кто нибудь не прочитает оттуда. Если Все дескр связ с одним из концов канала окажутся закрытыми, то его никогда не удастся использ. Чтение сначала прочитает внутренний буфер канала, а затем возвратит 0 (конец файла). (Если закр все дескрипторы на запись) Если закрыты все дескрипторы на чтение, то первая запись в канал приведет к тому, что процесс получит SIGPIPE(заверш процесса). Конвеер с помощью pipe: >ls–lR/grep ‘^d’
Int main(); Int fd[2]; Pipe(fd);
If (fork()==0) {close(fd[0]); Dup2(fd[1],1); close(fd[1]); Execlp(“ls”,”ls”,-lR”,NULL); Perror(“ошибка”); exit(1);
If (fork()==0) {close(fd[10]); Dup2(fd[0],0); close(fd[0]); Execlp(“grep”,”grep”,”^d”,NULL); Perror(“ошибка”); exit(2);
Close(fd[0]),close(fd[1]);wait(NULL);wait(NULL);return(0)
|