Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Psp_bilety_ekzamen.docx
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
142.82 Кб
Скачать

4 Билет

1)Посылка сигналов процессами

Сигналы посылаются:

  • с терминала, нажатием специальных клавиш или комбинаций (например, нажатие Ctrl-C генерирует SIGINT, а Ctrl-Z SIGTSTP;

  • ядром системы:

  • при возникновении аппаратных исключений (недопустимых инструкций, нарушениях при обращении в память, системных сбоях и т. п.);

  • ошибочных системных вызовах;

  • для информирования о событиях ввода-вывода;

  • одним процессом другому (или самому себе), с помощью системного вызова kill(), в том числе:

  • из shell, утилитой /bin/kill.

Сигналы не могут быть посланы завершившемуся процессу, находящемуся в состоянии “зомби”.

(Проце́сс-зо́мби, зо́мби (англ. zombie process, англ. defunct process) — дочерний процесс в Unix-системе, завершивший своё выполнение, но ещё присутствующий в списке процессов операционной системы, чтобы дать родительскому процессу считать код завершения.)

2)Межпроцессные комуникации

Межпроцессные комуникации (англ. Inter-Process Communication,  IPC) — набор способов обмена данными между множеством потоков в одном или более процессах. Процессы могут быть запущены на одном или более компьютерах, связанных между собой сетью. IPC-способы делятся на методы обмена сообщениями, синхронизации, разделяемой памяти и удаленных вызовов (RPC). Методы IPC зависят от пропускной способности и задержки взаимодействия между потоками и типа передаваемых данных.

IPC также может упоминаться как межпотоковое взаимодействие (англ. inter-thread communication), межпоточное взаимодействие и межпрограммное взаимодействие (англ. inter-application communication).

IPC наряду с концепцией адресного пространства является основой для разграничения адресного пространства.

3)Примеры в качестве примера можно привести программу ,которая принимает сигналы о прерывании (sigint) и сама посылает их (в результате выполнения функции kill

#include <signal.h>

main()

{

extern catcher();

signal(SIGINT,catcher);

Kill(0, SIGINT);

}

catcher()

{

}

5 Билет.

1. Полудуплексные каналы UNIX. Основные понятия. Канал это средство связи стандартного вывода одного процесса со стандартным вводом другого. Каналы старейший из инструментов IPC, существующий приблизительно со времени появления самых ранних версий операционной системы UNIX. Они предоставляют метод односторонних коммуникаций (отсюда термин half duplex) между процессами.

2. Создание каналов на Си. Создание каналов на Си. Создание каналов на языке программирования Си может оказаться чуть более сложным, чем простой shell-пример. Чтобы создать простой канал на Си, мы прибегаем к использованию системного вызова pipe. Для него требуется единственный аргумент, который является массивом из двух целых (integer), и в случае успеха массив будет содержать два новых файловых дескриптора, которые будут использованы для канала. После создания канала процесс обычно порождает новый процесс (вспомним, что процесс-потомок наследует открытые файловые дескрипторы).int pipe( int fd[2] ); Первое целое в массиве (элемент 0) установлено и открыто для чтения, в то время как второе целое (элемент 1) установлено и открыто для записи, т.е. вывод fd[1] становится вводом для fd[0]. Еще раз отметим, что все данные, проходящие через канал, перемещаются через ядро. Если родитель хочет получить данные от потомка, то он должен закрыть fd[1], а потомок должен закрыть fd[0]. Если родитель хочет послать данные потомку, то он должен закрыть fd[0], а потомок fd[1].С тех пор, как родитель и потомок делят между собой дескрипторы, мы должны всегда быть уверены, что неиспользуемый нами в данный момент конец канала закрыт.

3. Пример:

int fd[2], nbytes; pid_t childpid; char string[] = "Hello, world!\n"; char readbuffer[80]; pipe(fd); perror("fork"); exit(1); } if(childpid == 0) { /* Потомок закрывает вход */ close(fd[0]); /* Посылаем "string" через выход канала */ write(fd[1], string, strlen(string)); exit(0); } else { /* Родитель закрывает выход */ close(fd[1]); /* Чтение строки из канала */ nbytes = read(fd[0], readbuffer, sizeof(readbuffer)); printf("Received string: %s", readbuffer); }

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]