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

6 Билет.

1. Системный вызов dup. int dup( int oldfd );

Несмотря на то, что старый и новый дескрипторы взаимозаменяемы, мы будем сначала закрывать один из стандартных потоков. Системный вызов dup использует наименьший по номеру неиспользуемый дескриптор.

2. Системный вызов dup2. Существует другой системный вызов dup2. int dup2( int oldfd, int newfd );

Благодаря этому особенному вызову, мы имеем закрытую операцию идействующую копию за один системный вызов. Он гарантированно [неделим], т.е. никогда не будет прерван поступающим сигналом. С первым системным вызовом dup программисты были вынуждены предварительно выполнять операцию close, что приводило к наличию двух системных вызовов с малой степенью защищенности в краткий промежуток времени между ними. Если бы сигнал поступил в течение этого интервала времени, копия дескриптора не состоялась бы; dup2 разрешает эту проблему.

3. Пример: childpid = fork(); if(childpid == 0) {/* Закрываем стандартный ввод потомка */ close(0);/* Дублируем вход канала на stdin */ dup(fd[0]);execlp("sort", "sort", NULL);

7 Билет

1)Атомарные (неделимые) операции с каналами

Для того чтобы операция рассматривалась как "атомарная", она не должна прерываться ни по какой причине. Неделимая операция выполняется сразу. POSIX стандарт говорит в /usr/include/posix_lim.h, что максимальные размеры буфера для атомарной операции в канале таковы:

#define _POSIX_PIPE_BUF 512

Атомарно по каналу может быть получено или передано до 512 байт. Все, что выходит за эти пределы, будет разбито и не будет выполняться атомарно. Однако, в Linux этот атомарный операционный лимит определен в "linux/limits.h" следующим образом:

#define PIPE_BUF 4096

Как вы можете заметить, Linux предоставляет минимальное количество байт, требуемое POSIX, довольно щедро. Атомарность операции с каналом становится важной, если вовлечено более одного процесса (FIFOS). Например, если количество байтов, записанных в канал, превышает лимит, отпущенный на отдельную операцию, а в канал записываются многочисленные процессы, то данные будут смешаны, т.е. один процесс может помещать данные в канал между записями других.

2)Примечания к полудуплексным каналам

  • Двусторонние каналы могут быть созданы посредством открывания двух каналов и правильным переопределением файловых дескрипторов в процессе-потомке.

  • Вызов pipe() должен быть произведен ПЕРЕД вызовом fork(), или дескрипторы не будут унаследованы процессом-потомком! (то же для popen()).

  • С полудуплексными каналами любые связанные процессы должны разделять происхождение. Поскольку канал находится в пределах ядра, любой процесс, не состоящий в родстве с создателем канала, не имеет способа адресовать его. Это не относится к случаю с именованными каналами (FIFOS).

8 Билет

1)Именованные каналы (fifo: First In First Out): основные понятия

Именованные каналы во многом работают так же, как и обычные каналы, но все же имеют несколько заметных отличий.

  • Именованные каналы существуют в виде специального файла устройства в файловой системе.

  • Процессы различного происхождения могут разделять данные через такой канал.

  • Именованный канал остается в файловой системе для дальнейшего использования и после того, как весь ввод/вывод сделан.

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