- •Введение
- •Глава 1. Фундаментальные концепции unix Систем
- •Программы, процессы и потоки
- •Сигналы
- •Идентификаторы процессов, группы процессов и сеансы
- •Система прав
- •Другие атрибуты процесса
- •Межпроцессное взаимодействие
- •Использование системных вызовов
- •Краткие описания функций и обработка ошибок
- •Контрольные вопросы
- •Литература
- •Глава 2. Базовые операции ввода-вывода
- •Файловые операции ввода - вывода
- •Стандартные дескрипторы
- •Системные вызовы open и creat
- •Системный вызов umask
- •Системный вызов unlink
- •Текущая позиция в файле
- •Системный вызов write
- •2.8. Системный вызов read
- •2.9. Системный вызов close
- •2.10. Системный вызов lseek
- •2.11. Системные вызовы pread и pwrite
- •2.12. Системные вызовы truncate и ftruncate
- •Контрольные вопросы
- •Литература
- •Глава 3. Дополнительные операции файлового ввода_вывода
- •Низкоуровневый доступ к файловой системе
- •Жесткие и символические ссылки
- •Системный вызов getcwd
- •Отображение метаданных файла
- •Системные вызовы getpwuid, getgrgid и getlogin
- •Каталоги
- •Системные вызовы chdir и fchdir
- •Системные вызовы mkdir и rmdir
- •Контрольные вопросы
- •Литература
- •Глава 4. Процессы и потоки
- •4.1. Среда окружения
- •Системный вызов exec
- •Системный вызов fork
- •Завершение процесса и системные вызовы exit
- •Системные вызовы wait, waitpid и waitid
- •Получение и изменение идентификаторов пользователя и группы
- •Получение и изменение приоритета
- •Контрольные вопросы
- •Литература
- •Глава 5. Механизмы межпроцессного взаимодействия
- •5.1. Каналы
- •5.2. Системные вызовы dup и dup2
- •5.3. Двунаправленное взаимодействие с использованием однонаправленных каналов
- •Контрольные вопросы
- •Литература
- •Глава 6.Механизмы взаимодействия процессов
- •Именованные каналы (fifo)
- •Системные вызовы для работы с очередями сообщений posix
- •Семафоры
- •Системные вызовы для работы с общей памятью posix
- •Контрольные вопросы
- •Литература
- •Глава 7.Сетевое взаимодействие и сокеты
- •Основные системные вызовы для работы с сокетами, образующими логические соединения
- •Обслуживание нескольких клиентов
- •Адресация сокетов
- •In_port_t sin_port; /* номер порта (uint16_t) */
- •In_addr_t s_addr; /* адрес iPv4 (uint32_t) */
- •Домен адресов af_inet6
- •In_port_t sin6_port; /* номер порта (uint16_t) */
- •Доменная система именования
- •Параметры сокетов
- •Контрольные вопросы
- •Литература
- •Глава 8.Сигналы и таймеры
- •Введение в сигналы
- •Жизненный цикл сигналов
- •Типы сигналов
- •Системный вызов sigaction
- •Контрольные вопросы
- •Литература
- •Заключение
- •Список литературы
- •Глава 2. Базовые операции ввода-вывода 14
- •Глава 3. Дополнительные операции файлового ввода_вывода 25
- •Глава 6. Механизмы взаимодействия процессов 58
Контрольные вопросы
Перечислите основные типы файлов.
Организация системы прав доступа в Unix.
Как осуществляется межпроцессное взаимодействие?
Как осуществляется обработка ошибок?
Опишите общие принципы вызова библиотечных функций и системных вызовов из языка С.
Литература
Рочкинд, М. Программирование для Unix / М. Рочкинд. – М.: СПб: БХВ-Петербург, 2005. – 704 с.
Глас Г., Эйблс К. Unix для программистов и пользователей. / Г. Глас, К. Эйблс – СПб.: БХВ-Петербург, 2004. – 848 с.: ил.
Брюс М. Unix/Linux: Теория и практика программирования. / М.Брюс - Издательство "Кудиц-Образ", 2004. -576 с.
Собель М.Г. Linux. Администрирование и системное программирование. / М.Г. Собель. - Издательство: Питер, 2011. – 880 с.
Глава 2. Базовые операции ввода-вывода
В этой главе рассмотрим базовые операции ввода-вывода, применимые к обычным файлам.
Файловые операции ввода - вывода
Рассмотрим простой пример функции, в котором используются четыре системных вызова: open, read, write и close. Эта функция копирует данные из одного файла в другой (подобно команде cp):
#define BUFSIZE 512
void copy(char *from, char *to) /* содержит ошибку */
{
int fromfd = -1, tofd = -1;
ssize_t_nread;
char buf[BUFSIZE];
ec_neg1(fromfd = open(from, O_RDONLY))
ec_neg1(tofd = open(to, O_WRONLY | O_CREAT | O_TRUNC , S_IRUSR | S_IWUSR))
while ((nread = read(fromfd, buf, sizeof(buf))) > 0)
if (write(tofd, buf, nread) != nread)
EC_FAIL
ec_neg1(close(fromfd))
ec_neg1(close(tofd))
return;
EC_CLEANUP_BGN
(void) close(fromfd);
(void) close(tofd);
EC_CLEANUP_END
Попробуйте отыскать ошибку в теле функции. Первый вызов open открывает файл на чтение ( о чем свидетельствует ключ O_RDONLY) и возвращает дескриптор файла, который будет использоваться в последующих системных вызовах. Второй вызов open создаст новый файл (о чем свидетельствует ключ O_CREAT) либо, если файл с заданным именем уже существует, усекает его размер до нуля (O_TRUNC). В любом случае этот вызов открывает файл на запись и возвращает его дескриптор. Третий аргумент вызова open - биты набора прав доступа, которые будут присвоены вновь созданному файлу (в данном случае права на чтение и запись выдаются только владельцу файла). Вызов read читает данные в буфер. Указатель на буфер передается во втором аргументе. Размер буфера в байтах передается в третьем аргументе. Он возвращает количество прочитанных байт или нуль в случае достижения конца файла, или -1 в случае возникновения ошибки. Вызов write записывает в файл данные из буфера. Вызов close закрывает дескрипторы файлов. Для большего удобства, вместо условных операторов if, вызовов fprintf и перехода на обработку ошибок, использовалось макроопределение ec_neg1 и EC_FAIL. Оно завершает работу функции, если его аргумент равен -1.
Каждый процесс в Unix владеет набором файловых дескрипторов, которые нумеруются от 0 до N, где N – максимально возможное число одновременно открытых файловых дескрипторов. Число N зависит от версии ОС Unix и ее конфигурации. В любом случае это число не бывает меньше 16. Чтобы получить фактическое значение числа N, нужно вызвать sysconf с аргументом _SC_OPEN_MAX, например так: printf(“_SC_OPEN_MAX = %ld\n”, sysconf((“_SC_OPEN_MAX );
В операционной системе Linux 2.4 получим число 1024, в FreeBSD - 957, в Solaris - 256.