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

2)Операции с fifo

Операции ввода/вывода с FIFO, по существу, такие же, как для обычных каналов, за одним исключением. Чтобы физически открыть проход к каналу, должен быть использован системный вызов "open" или библиотечная функция. С полудуплексными каналами это невозможно, поскольку канал находится в ядре, а не в физической файловой системе. В нашем примере мы будем трактовать канал как поток, открывая его fopen() и закрывая fclose().

3) Примеры

Рассмотрим простой сервер-процесс:

/*****************************************************************************

Excerpt from "Linux Programmer's Guide - Chapter 6"

(C)opyright 1994-1995, Scott Burkett

*****************************************************************************

MODULE: fifoserver.c

*****************************************************************************/

#include <stdio.h>

#include <stdlib.h>

#include <sys/stat.h>

#include <unistd.h>

#include <linux/stat.h>

#define FIFO_FILE "MYFIFO"

int main(void)

{

FILE *fp;

char readbuf[80];

/* Create the FIFO if it does not exist */

umask(0);

mknod(FIFO_FILE, S_IFIFO|0666, 0);

while(1)

{

fp = fopen(FIFO_FILE, "r");

fgets(readbuf, 80, fp);

printf("Received string: %s\n", readbuf);

fclose(fp);

}

return(0);

}

Поскольку FIFO блокирует по умолчанию, запустим сервер фоном после того, как его откомпилировали:

$ fifoserver&

Скоро мы обсудим действие блокирования, но сначала рассмотрим следующего простого клиента для нашего сервера:

/*****************************************************************************

Excerpt from "Linux Programmer's Guide - Chapter 6"

(C)opyright 1994-1995, Scott Burkett

*****************************************************************************

MODULE: fifoclient.c

*****************************************************************************/

#include <stdio.h>

#include <stdlib.h>

#define FIFO_FILE "MYFIFO"

int main(int argc, char *argv[])

{

FILE *fp;

if (argc != 2)

{

printf("USAGE: fifoclient [string]\n");

exit(1);

}

if ((fp = fopen(FIFO_FILE, "w")) == NULL)

{

perror("fopen");

exit(1);

}

fputs(argv[1], fp);

fclose(fp);

return(0);

}

9 Билет

1) Базовые понятия System V ipc

Вместе с System V AT&T предложил три новых типа IPC средств (очереди сообщений, семафоры и разделяемая память). POSIX еще не стандартизировал эти средства, но большинство разработок их уже поддерживает. Впрочем, Беркли (BSD) в качестве базовой формы IPC использует скорее сокеты, чем элементы System V. Linux имеет возможность использовать оба вида IPC (BSD и System V)

2) Идентификаторы ipc

Каждый объект IPC имеет уникальный IPC идентификатор. (Когда мы говорим "объект IPC", мы подразумеваем очередь единичных сообщений, множество семафоров или разделяемый сегмент памяти.) Этот идентификатор требуется ядру для однозначного определения объекта IPC. Например, чтобы сослаться на определенный разделяемый сегмент, единственное, что вам потребуется, это уникальное значение ID, которое привязано к этому сегменту.

Идентификатор IPC уникален только для своего типа объектов. То есть, скажем, возможна только одна очередь сообщений с идентификатором "12345", так же как номер "12345" может иметь какое-нибудь одно множество семафоров или (и) какой-то разделяемый сегмент.

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