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

Следующие два системных вызова создают и удаляют каталоги:

mkdir - создает каталог

#include <sys/stat.h>

int mkdir (

const char *path, /* полное имя каталога */

mode_t perms /* права доступа */

);

/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки - в переменной

errno) */

rmdir - удаляет каталог

#include <unistd.h>

int rmdir (

const char *path, /* полное имя каталога */

);

/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки - в переменной

errno) */

Окончательные права доступа к каталогу, создаваемому вызовом mkdir, определяются в соответствии с маской. Перед удалением каталог должен быть пустым. Если каталог не пуст, то сначала придется удалить все вложенные подкаталоги и файлы серией вызовов unlink и mkdir.

    1. Изменение индексного узла

В таблице 3.1 показано, какие системные вызовы, какие поля индексного узла изменяют. Прочерк означает, что это поле вообще не изменяется, оно получает свое значение в момент создания индексного узла. Побочный эффект означает, что это поле изменяется только в результате побочного эффекта от какого-либо воздействия, например, в результате создания новой ссылки системным вызовом link, но не может изменяться непосредственно.

Таблица 3.1. Изменения полей индексных узлов

Поле

Описание

Каким вызовом изменяется

st_dev

идентификатор устройства файловой системы

-

st_ino

номер индексного узла

-

st_mode

режимы

chmod, fchmod

st_nlink

количество жестких ссылок

побочный эффект

st_uid

идентификатор пользователя

chown, fchown, lchown

st_gid

идентификатор группы

chown, fchown, lchown

st_rdev

идентификатор устройства

-

st_size

размер в байтах

побочный эффект

st_atime

время последнего обращения

побочный эффект

st_mtime

время последнего изменения

utime

st_ctime

время последнего изменения индексного узла

utime

st_blksize

оптимальный размер блока для операций ввода-вывода

-

st_blocks

размер в блоках по 512 байт

побочный эффект

chmod - изменяет режимы доступа по имени файла

#include <sys/stat.h>

int chmod (

const char *path, /* имя файла */

mode_t mode /* новые режимы */

);

/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки - в переменной

errno) */

fchmod - изменяет режимы доступа по дескриптору файла

#include <sys/stat.h>

int fchmod (

int fd, /* дескриптор файла */

mode_t mode /* новые режимы */

);

/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки - в переменной

errno) */

Системный вызов chmod изменяет режимы доступа к существующему файлу любого типа. Системный вызов fchmod очень похож на chmod, но в качестве аргумента принимает не имя, а дескриптор файла. Изменить режимы доступа может только процесс, имеющий права суперпользователя, или идентичный файлу действующий идентификатор пользователя. Недостаточно иметь права на запись в файл. Кроме того, чтобы установить флаг S_ISGID, процесс должен иметь идентичный файлу действующий идентификатор группы (кроме суперпользователя). Если не собираетесь менять режимы доступа целиком, то сначала нужно получить существующие режимы вызовом stat, затем установить или сбросить необходимые биты и потом вызвать chmod для изменения режимов.

      1. Системные вызовы chown, fchown и lchown

Системный вызов chown изменяет идентификаторы пользователя и группы файла. Эта операция доступна только владельцу файла и суперпользователю. Если один из аргументов имеет значение -1, то соответствующий ему идентификатор остается без изменений.

chown - изменяет владельца и группу файла по его имени

#include <unistd.h>

int chown (

const char *path, /* имя файла */

uid_t uid, /* новый идентификатор пользователя */

gid_t gid /* новый идентификатор группы*/

);

/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки - в переменной

errno) */

fchown - изменяет владельца и группу файла по дескриптору

#include <unistd.h>

int fchown (

int fd, /* дескриптор файла */

uid_t uid, /* новый идентификатор пользователя */

gid_t gid /* новый идентификатор группы*/

);

/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки - в переменной

errno) */

lchown - изменяет владельца и группу символической ссылки по ее имени

#include <unistd.h>

int lchown (

const char *path, /* имя ссылки */

uid_t uid, /* новый идентификатор пользователя */

gid_t gid /* новый идентификатор группы*/

);

/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки - в переменной

errno) */

Системный вызов lchown воздействует на саму символическую ссылку, а не на объект ссылки.

      1. Системный вызов utime

Вызов utime устанавливает время последнего обращения и изменения файла:

#include <utime.h>

int utime (

const char *path, /* имя файла */

const struct utimbuf *timbuf /* новое время */

);

/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки - в переменной

errno) */

struct utimbuf - используемая при обращении к вызову utime

struct utimbuf {

time_t actime; /* время последнего обращения */

time_t modtime; /* время последнего изменения*/

};

Системный вызов utime изменяет время последнего обращения и последнего изменения файла любого типа. Тип time_t описывает число секунд, прошедших с начала эпохи. Только владелец и суперпользователь могут изменить время последнего обращения и изменения. Если вместо указателя на timbuf передается значение NULL, то используется текущее время. Сделано это для того, чтобы иметь возможность имитировать обновление файла без необходимости перезаписи и в первую очередь для удобства команды touch. Любой процесс, обладающий правом на запись в файл, может обратиться к этому вызову. Этот вызов часто применяется к файлам, полученным из резервных копий или по сети, когда времена устанавливаются в их первоначальные значения. Время последнего изменения индексного узла не может быть переустановлено, но этого и не требуется, поскольку индексные узлы не перемещаются - они каждый раз создаются заново.

      1. Системный вызов mknod

Системный вызов mknod создает файл:

#include <sys/stat.h>

int mknod (

const char *path, /* имя файла */

mode_t perms, /* права доступа */

dev_t dev /* идентификатор устройства */

);

/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки - в переменной

errno) */

Системный вызов mknod может создавать обычные файлы, каталоги, специальные файлы и именованные каналы. Единственная переносимая операция, которую можете сделать с помощью mknod, не обладая правами суперпользователя, это создать именованный канал, но для этого существует системный вызов mkfifo. Основное назначение mknod - это создание специальных файлов устройств, как правило, в каталоге /dev. Делается это обычно во время установки нового драйвера устройства, когда вызывается команда mknod, которая обращается к одноименному системному вызову. Аргумент perms задает права доступа к файлу с использованием битовых масок. Аргумент dev - это идентификатор устройства.