Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учеб.пос.СП.doc
Скачиваний:
28
Добавлен:
31.03.2015
Размер:
1.33 Mб
Скачать

Контрольные вопросы

  1. Перечислите основные типы файлов.

  2. Организация системы прав доступа в Unix.

  3. Как осуществляется межпроцессное взаимодействие?

  4. Как осуществляется обработка ошибок?

  5. Опишите общие принципы вызова библиотечных функций и системных вызовов из языка С.

Литература

  1. Рочкинд, М. Программирование для Unix / М. Рочкинд. – М.: СПб: БХВ-Петербург, 2005. – 704 с.

  2. Глас Г., Эйблс К. Unix для программистов и пользователей. / Г. Глас, К. Эйблс – СПб.: БХВ-Петербург, 2004. – 848 с.: ил.

  3. Брюс М. Unix/Linux: Теория и практика программирования. / М.Брюс - Издательство "Кудиц-Образ", 2004. -576 с.

  4. Собель М.Г. Linux. Администрирование и системное программирование. / М.Г. Собель. - Издательство: Питер, 2011. – 880 с.

Глава 2. Базовые операции ввода-вывода

В этой главе рассмотрим базовые операции ввода-вывода, применимые к обычным файлам.

    1. Файловые операции ввода - вывода

Рассмотрим простой пример функции, в котором используются четыре системных вызова: 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.