Листинг 23. Программа, реализующая клиент
31.sprintf(msgptr->buff, “Здравствуй, Мир!\n”);
32./*Oсвободим разделяемую память*/
33.if (semop(semid, &mem_unlock[0], 1) < 0){
34.printf(“Невозможно выполнить операцию\n”); exit(1);
35.}
36./* Ждём, пока сервер в свою очередь не освободит *
* разделяемую память |
*/ |
37.if (semop(semid, &mem_lock[0], 2) < 0){
38.printf(“Невозможно выполнить операцию\n”); exit(1);
39.}
40./*Отключимся от области*/
41.if (shmdt(msgptr) < 0){
42.printf(“Ошибка отключения\n”); exit(1);
43.}
44./*Удалим созданные объекты IPC*/
45.if (shmctl(shmid, IPC_RMID, 0) < 0){
46.printf(“Невозможно удалить область\n”); exit(1);
47.}
48.if (semctl(semid, 0, IPC_RMID) < 0){
49.printf(“Невозможно удалить семафор\n”); exit(1);
50.}
51.exit(0);
52.}
Контрольные вопросы
1.Перечислите средства межпроцессного взаимодействия.
2.Как происходит передача аргументов исполняемой программе?
3.Какие функции используются для разпознавания опций? Чем отличается длинная опция от короткой?
4.Расскажите о взаимодействии исполняемой программы со средой окружения.
5.Для чего предназначен сигнал SIGCHLD? Почему важно, чтобы родительский процесс «дождался», пока завершится дочерний?
6.Расскажите о синхронизации выполнения нитей. Что такое mutex?
7.Расскажите о взаимодействии процессов через программные каналы.
8.Что такое FIFO? Как организовать взаимодействие процессов через именованный канал?
9.Что такое сигнал? Какие типы сигналов Вы знаете? Поясните каждый тип.
10.Для чего используется системный вызов raise?
11.Как организовать передачу сообщений между процессами?
12.Что такое семафор? Поясните применение семафоров на примере.
111
13. Как организовать обмен данными между процессами через разделяемую память? Какие функции для этого используют?
112
СПИСОК ЛИТЕРАТУРЫ
1.Таненбаум Э. Операционные системы: разработка и реализация. 3-е изд. /
Э. Таненбаум, А. Вудхалл. – СПб.: Питер, 2007. – 704 с. – ISBN 978-5-469- 01403-4.
2.Стивенс У. UNIX: взаимодействие процессов / У. Стивенс. – СПб.: Питер, 2003. – 576 с. – ISBN 5-318-00534-9.
3.Иванов Н.Н. Программирование в Linux. Самоучитель. / Н.Н. Иванов. –
СПб.: БХВ-Петербург, 2007. – 416 с. – ISBN 978-5-9775-0071-5.
4. Немет Э. UNIX: руководство системного администратора / Э. Немет,
Г. Снайдер, С. Сибасс, Т.Р. Хейн. – Киев: BHV, 2002. – 928 с. – ISBN 966- 552-106-3.
5.Бэкон Д. Операционные системы / Д. Бэкон, Т. Харрис. – Киев: BHV, 2004. – 800 с. – ISBN 966-552-136-5.
6.Краковяк С. Основы организации и функционирования ОС ЭВМ: Пер. с
франц. / С. Краковяк. – М.: Мир, 1988. – 480 с. – ISBN 5-03-00481-5.
7.Олифер В.Г. Сетевые операционные системы. 2-е изд. / В.Г. Олифер,
Н.А. Олифер. – СПб.: Питер, 2009. – 672 с. – ISBN 978-5-91180-528-9.
8.Таненбаум Э. Современные операционные системы. 3-е изд. / Э. Таненбаум.
– СПб.: Питер, 2010. – 1120 с. – ISBN 978-5-49807-306-4.
9.Столингс В. Операционные системы. 4-е изд.: Пер. с англ. / В. Столингс. –
М.: Вильямс, 2004. – 848 с. – ISBN 5-8459-0310-6.
10. Таненбаум Э. Распределённые системы. Принципы и парадигмы / Э. Танненбаум, М. ван Стеен. – СПб.: Питер, 2003. – 880 с. – ISBN 5-272- 00053-6.
113
ПРИЛОЖЕНИЕ 1 КОДЫ ОШИБОК
Код ошибки |
Сообщение |
Описание |
E2BIG |
Аrg list too long |
Размер списка аргументов, переданных системному |
|
|
вызову ехес, плюс размер экспортируемых перемен- |
|
|
ных окружения превышает ARGMAX байт. |
EACCESS |
Permission denied |
Попытка доступа к файлу с недостаточными правами |
|
|
для данного класса (определяемого эффективными |
|
|
UID и GID процесса и соответствующими идентифи- |
|
|
каторами файла). |
EAGAIN |
Resource |
Превышен предел использования некоторого ресурса, |
|
temporarily |
например, переполнена таблица процессов, или поль- |
|
unavailable |
зователь превысил ограничение по количеству про- |
|
|
цессов с одинаковым UID. Причиной также может |
|
|
являться недостаток памяти или превышение соответ- |
|
|
ствующего ограничения. |
EALREADY |
Operation already in |
Попытка операции с неблокируемым объектом, уже |
|
progress |
обслуживающим некоторую операцию. |
EBADF |
Bad file number |
Попытка операции с файловым дескриптором, не ад- |
|
|
ресующим никакой файл; также попытка операции |
|
|
чтения или записи с файловым дескриптором, полу- |
|
|
ченным при открытии файла на запись или чтение, |
|
|
соответственно. |
EBADFD |
File descriptor in bad |
Файловый дескриптор не адресует открытый файл |
|
state |
или попытка операции чтения с файловым дескрип- |
|
|
тором, полученным при открытии файла только на |
|
|
запись. |
EBUSY |
Device busy |
Попытка монтирования устройства (файловой систе- |
|
|
мы), которое уже примонтировано; попытка размон- |
|
|
тировать файловую систему, имеющую открытые |
|
|
файлы; попытка обращения к недоступным ресурсам |
|
|
(семафоры, блокираторы и т.п.). |
ECHILD |
No child processes |
Вызов функции wait процессом, не имеющим дочер- |
|
|
них процессов или процессов, для которых уже был |
|
|
сделан вызов wait. |
EDQUOT |
Disk quota exceeded |
Попытка записи в файл, создание каталога или файла |
|
|
при превышении квоты пользователя на дисковые |
|
|
блоки, попытка создания файла при превышении |
|
|
пользовательской квоты на число inode. |
EEXIST |
File exists |
Имя существующего файла использовано в недопус- |
|
|
тимом контексте, например, сделана попытка созда- |
|
|
ния символической ссылки с именем уже сущест- |
|
|
вующего файла. |
EFAULT |
Bad address |
Аппаратная ошибка при попытке использования сис- |
|
|
темой аргумента функции, например, в качестве ука- |
|
|
зателя передан недопустимый адрес. |
EFBIG |
File too large |
Размер файла превысил установленное ограничение |
|
|
RLIMIT_FSIZE или максимально допустимый размер |
|
|
для данной файловой системы. |
114
EINPROGRESS |
Operation now in |
Попытка длительной операции (например, уста- |
|
progress |
новление сетевого соединения) для неблокируемо- |
|
|
го объекта. |
EINTR |
Interrupted system |
Получение асинхронного сигнала, например, сигнала |
|
call |
SIGINT или SIGQUIT, во время обработки системно- |
|
|
го вызова. Если выполнение процесса будет продол- |
|
|
жено после обработки сигнала, прерванный систем- |
|
|
ный вызов завершится с этой ошибкой. |
EINVAL |
Invalid argument |
Передача неверного аргумента системному вызову. |
|
|
Например, размонтирование устройства (файловой |
|
|
системы), которое не было примонтировано. Другой |
|
|
пример – передача номера несуществующего сигнала |
|
|
системному вызову kill. |
ЕIO |
I/O error |
Ошибка ввода-вывода физического устройства. |
EISDIR |
Is a directory |
Попытка операции, недопустимой для каталога, на- |
|
|
пример, запись в каталог с помощью вызова write. |
ELOOP |
Number of symbolic |
При попытке трансляции имени файла было обнару- |
|
links encountered |
жено недопустимо большое число символических |
|
during path name |
ссылок, превышающее значение MAXSYMLINKS. |
|
traversal exceeds |
|
|
MAXSYMLINKS |
|
EMFILE |
Too many open files |
Число открытых файлов для процесса превысило |
|
|
максимальное значение OPENMAX. |
ENAMETOOLONG |
File name too long |
Длина полного имени файла (включая путь) превыси- |
|
|
ла максимальное значение РАТНМАХ. |
ENFILE |
File table overflow |
Переполнение файловой таблицы. |
ENODEV |
No such device |
Попытка недопустимой операции для устройства. На- |
|
|
пример, попытка чтения устройства только для запи- |
|
|
си или операция для несуществующего устройства. |
ENOENT |
No such file or di- |
Файл с указанным именем не существует или отсут- |
|
rectory |
ствует каталог, указанный в полном имени файла. |
ENOEXEC |
Exec format error |
Попытка запуска на выполнение файла, который име- |
|
|
ет права на выполнение, но не является файлом до- |
|
|
пустимого исполняемого формата. |
ENOMEM |
Not enough space |
При попытке запуска программы (ехес) или размеще- |
|
|
ния памяти (brk) размер запрашиваемой памяти пре- |
|
|
высил максимально возможный в системе. |
ENOMSG |
No message of de- |
Попытка получения сообщения определённого типа, |
|
sired type |
которого не существует в очереди. |
ENOSPC |
No space left on de- |
Попытка записи в файл или создания нового каталога |
|
vice |
при отсутствии свободного места на устройстве (в |
|
|
файловой системе). |
ENOSR |
Out of stream |
Отсутствие очередей или головных модулей при по- |
|
resources |
пытке открытия устройства STREAMS. Это состоя- |
|
|
ние является временным. После освобождения соот- |
|
|
ветствующих ресурсов другими процессами операция |
|
|
может пройти успешно. |
ENOSTR |
Not a stream device |
Попытка применения операции, определённой для |
|
|
устройств типа STREAMS (например, системного вы- |
|
|
зова putmsg или gefmsg), для устройства другого типа. |
ENOTDIR |
Not a directory |
В операции, предусматривающей в качестве аргумен- |
|
|
та имя каталога, было указано имя файла другого ти- |
115