- •20 Билет
- •1)Установление связи
- •2) Передача данных
- •2.Системные вызовы
- •3.Примеры
- •2 Билет.
- •1.Управление процессами
- •2. Сигналы.
- •3 Билет
- •1.Обработка Сигнала
- •2) Группы процессов
- •3)Примеры
- •4 Билет
- •1)Посылка сигналов процессами
- •2)Межпроцессные комуникации
- •3)Примеры в качестве примера можно привести программу ,которая принимает сигналы о прерывании (sigint) и сама посылает их (в результате выполнения функции kill
- •5 Билет.
- •6 Билет.
- •7 Билет
- •1)Атомарные (неделимые) операции с каналами
- •2)Примечания к полудуплексным каналам
- •8 Билет
- •1)Именованные каналы (fifo: First In First Out): основные понятия
- •2)Операции с fifo
- •3) Примеры
- •9 Билет
- •1) Базовые понятия System V ipc
- •2) Идентификаторы ipc
- •10 Билет
- •11 Билет
- •1)Буфер сообщения
- •13 Билет
- •1)Системный вызов msgctl
- •2)Семафоры. Основные понятия
- •1)Системный вызов semget.
- •2) Системный вызов semop.
- •15 Билет
- •1) Системный вызов semctl
- •2) Разделяемая память. Основные понятия.
- •3) Примеры
- •16 Билет
- •1) Системный вызов shmget
- •2) Системный вызов shmctl
- •3) Примеры
- •17 Билет
- •Системный вызов shmat
- •Системный вызов shmdt
- •18 Билет
- •Системный вызов mmap
- •19 Билет
- •1) Создание сокета
- •2) Привязка к локальным именам
- •3) Примеры:
- •20 Билет
- •1)Установление связи
- •2) Передача данных
- •3) Примеры Установление связи
- •Передача данных
- •21 Билет
- •1. Закрытие сокетов.
- •22 Билет.
- •1) Алгоритмы
- •2) Оценки эффективности алгоритмов.
- •3) Примеры
- •23 Билет
- •1.Ядро операционной системы
- •2.Системные вызовы
- •3.Примеры
- •24 Билет.
- •25 Билет
- •1) Системный вызов semctl
- •2) Разделяемая память. Основные понятия.
- •3) Примеры
- •26 Билет
- •1) Группы процессов
- •2)Обработка Сигнала
- •3)Примеры
- •27 Билет
- •1) Создание сокета
- •2) Привязка к локальным именам
- •3) Примеры:
- •28 Билет.
- •29 Билет
- •1. Закрытие сокетов.
- •30 Билет
- •1)Установление связи
- •2) Передача данных
- •3) Примеры Установление связи
- •Передача данных
27 Билет
1) Создание сокета
s = socket(domain, type, protocol); Этот вызов основывается на информации о коммуникационном домене и типе сокета.
Функция socket создает конечную точку для коммуникаций и возвращает файловый дескриптор, ссылающийся на сокет, или -1 в случае ошибки. Данный дескриптор используется в дальнейшем для установления связи.
2) Привязка к локальным именам
Сокет создается без имени. Пока
с сокетом не будет связано имя, удаленные процессы не имеют возможности ссылаться на него и, следовательно, на данном сокете не может быть получено никаких сообщений.
3) Примеры:
Сокет
<?php
$address = 'mail.ru';
$port = 80;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, $address, $port);
socket_write($socket, "GET / HTTP/1.0\r\n\r\n");
$result = "";
while($read = socket_read($socket, 1024))
{
$result .= $read;
}
socket_close($socket);
echo "Полученный результат: $result\r\n";
?>
28 Билет.
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); }
