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

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); }

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