
- •Лабораторна робота № 10 основи роботи з операційною системою unix
- •1 Мета роботи
- •2 Основні положення
- •2.1 Загальна характеристика ос сімейства unix
- •2.2 Архітектура unix
- •2.3 Функціонування системи unix
- •2.3.1 Ядро системи
- •2.3.2 Початок і завершення сеансу робіт
- •3 Контрольні запитання
- •4 Домашнє завдання
- •5 Лабораторне завдання
- •6 Зміст протоколу
- •2.1 Основні характеристики FreeBsd
- •2.2 Історична довідка
- •2.3 Мета проекту FreeBsd
- •2.4 Вимоги до системи при інсталяції FreeBsd
- •3 Контрольні запитання
- •4 Домашнє завдання
- •5 Лабораторне завдання
- •2.1 Поняття процесу
- •2.2 Компоненти процесу
- •2.2.1 Ідентифікатор процесу
- •2.2.2 Ідентифікатор батьківського процесу
- •2.2.3 Ідентифікатор користувача і групи
- •2.3 Стан процесу, "заблукалі" процеси
- •2.4 Управління процесами, команди kill та nice
- •2.4.1 Дворівнева схема керування процесами
- •2.4.2 Команда kill
- •2.4.3 Команда nice
- •2.5 Поточний контроль процесів, команди ps та top
- •2.6 Захист фонових процесів, команда nohup
- •3 Ключові запитання
- •4 Домашнє завдання
- •5 Лабораторне завдання
- •6 Зміст протоколу
- •7 Список рекомендованої літератури
- •Лабораторна робота № 13 права доступу в операційній системі unix
- •1 Мета роботи
- •2 Основні положення
- •2.1 Поняття прав доступу користувача
- •2.2 Основні біти доступу (читання/запис/виконання)
- •2.3 Додаткові біти доступу
- •2.4 Сполучення бітів доступу
- •3 Контрольні запитання
- •4 Домашнє завдання
- •5 Лабораторне завдання
- •2.1 Основні поняття клієнт-серверної архітектури
- •2.2 Основи мережного програмування
- •2.3 Компіляція
- •3 Контрольні запитання
- •4 Домашнє завдання
- •5 Лабораторне завдання
- •6 Зміст протоколу
- •7 Список рекомендованої літератури
- •Основні комбінації клавіш і команди
- •Закінчення таблиці а2
- •Закінчення таблиці а4
- •Приклади програм для реалізації клієнт-серверної архітектури
- •Перевірка буфера
- •Зчитування запису
- •Лістинг 2 Server-сервер, котрий демонструє застосування функції readvrev
Перевірка буфера
Перевіряється, чи достатня є довжина буфера, наданого програмою, для розміщення в ньому всього запису. Якщо даних не вистачає, то дані зчитуються в буфер частинами по len байтів. Привласнюється змінній errno значення EMSGSIZE і повертає –1.
Зчитування запису
Зчитується сам запис. readvrec повертає –1, 0 чи reclen залежно від того, чи повернула readn код помилки, неповний лічильник нормального значення.
Лістинг 2 Server-сервер, котрий демонструє застосування функції readvrev
1 #include "etcp.h"
2 #define PORTNUM 9000
3 int main( int argc, char **argv )
4 {
5 struct sockaddr_in peer;
6 SOCKET s;
7 SOCKET s1;
8 int peerlen = sizeof( peer );
9 int n;
10 char buf[ 10 ];
11 INIT();
12 if ( argc == 2 )
13 s = tcp_server( NULL, argv[ 1 ] );
14 else
15 s = tcp_server( argv[ 1 ], argv[ 2 ] );
16 s1 = accept( s, ( struct sockaddr * )&peer, &peerlen );
17 if ( !isvalidsock( s1 ) )
18 error( 1, errno, "помилка виклику" );
19 for ( ;; )
20 {
21 n = readvrec( s1, buf, sizeof( buf ) );
22 if ( n < 0)
23 error( 0, errno, "readvrec повернув код помилки" );
24 else if ( n == 0 )
25 error( 1, 0, "client відімкнувся\n" );
26 else
27 write( 1, buf, n );
28 }
29 EXIT( 0 );
30 }
Ініциалізація сервера і прийняття лише одного повідомлення.
Викликається readvrec для читання чергового запису змінної довжини. Якщо відбулася помилка, то друкується діагностичне повідомлення і читається наступний запис. Якщо readvrec повертає EOF, то перечитується повідомлення — й робота завершується.
27 Виведення запису на stdout.
Лістинг 3 Client-клієнт, котрий надсилає записи змінної довжини
1 #include "etcp.h"
2 #define PORTNUM 9000
3 int main( int argc, char **argv )
4 {
5 SOCKET s;
6 int n;
7 struct
8 {
9 u_int32_t reclen;
10 char buf[ 128 ];
11 } packet;
12 INIT();
13 s = tcp_client( argv[ 1 ], argv[ 2 ] );
14 while ( fgets( packet.buf, sizeof( packet.buf ), stdin )
15 != NULL )
16 {
17 n = strlen( packet.buf );
18 packet.reclen = htonl( n );
19 if ( send( s, ( char * )&packet,
20 n + sizeof( packet.reclen ), 0 ) < 0 )
21 error( 1, errno, "send failure" );
22 }
23 EXIT( 0 );
}
Клієнт сполучується із сервером, викликаючи функцію tcp_client.
12, 13 Ініціалізація.
14...22 Викликається fgets для читання рядка зі стандартного введення. Цей рядок розміщується в пакеті повідомлення. Здобуте значення перетвориться на мережний порядок байтів і розміститься в полі reclen пакета. Наприкінці викликається send для надсилання пакета серверові.
Редактор І. В. Ращупкіна