Функция access()
R_OK
, W_OK
и X_OK
, соответствующих правам чтения, записи и выполнения. При наличии у процесса всех необходимых привилегий функция возвращает 0. Если файл существует, а нужные привилегии на доступ к нему у процесса отсутствуют, возвращается -1 и в переменную errno записывается код ошибки EACCES
(или EROFS
, если проверяется право записи в файл, который расположен в файловой системе, смонтированной только для чтения).Если второй аргумент равен F_OK
access()
проверяет лишь факт существования файла. В случае обнаружения файла возвращается 0, иначе — -1 (в переменную errno
помещается также код ошибки ENOENT
). Когда один из каталогов на пути к файлу недоступен, в переменную errno
будет помещён код EACCES
.Программа, показанная в листинге 8.1, с помощью функции access()
#include
#include
#include
int main(int argc, char* argv[]) {
char* path = argv[1];
int rval;
/* Проверка существования файла. */
rval = access(path, F_OK);
if (rval == 0)
printf("%s exists\n", path);
else {
if (errno == ENOENT)
printf("%s does not exist\n", path);
else if (errno == EACCES)
printf("%s is not accessible\n", path);
return 0;
}
/* Проверка права доступа. */
rval = access(path, R_OK);
if (rval == 0)
printf("%s is readable\n", path);
else
printf("%s is not readable (access denied)\n", path);
/* проверка права записи. */
rval = access(path, W_OK);
if (rval == 0)
printf("%s is writable\n", path);
else if (errno == EACCES)
printf("%s is not writable (access denied)\n", path);
else if (errno == EROFS)
printf("%s is not writable (read-only filesystem)\n",
path);
return 0;
}
Вот как, к примеру, проверить права доступа к файлу README
% ./check-access /mnt/cdrom/README
/mnt/cdrom/README exists
/mnt/cdrom/README is readable
/mnt/cdrom/README is not writable (read-only filesystem)
8.3. Функция fcntl(): блокировки и другие операции над файлами
Функция fcntl()
fcntl()
: блокирование файлов.Функция fcntl()
fcntl()
.Прежде чем ставить блокировку на файл, необходимо создать и обнулить структуру типа flock
l_type
должна быть записана константа F_RDLCK
в случае блокировки чтения и константа F_WRLCK
— в случае блокировки записи. Далее следует вызвать функцию fcntl()
, передав ей дескриптор файла, код операции F_SETLCKW
и указатель на структуру типа flock
. Если аналогичная блокировка уже была поставлена другим процессом, функция fcntl()
перейдет в режим ожидания, пока "мешающая" ей блокировка не будет снята.