Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект Лекций ПСРВ.doc
Скачиваний:
81
Добавлен:
12.02.2016
Размер:
2.73 Mб
Скачать

5.13.2. Дублирование дескриптора файла

Можно создать копию дескриптора открытого файла такую, что новый дескриптор, будет иметь следующие общие свойства с исходным дескриптором файла:

       тот же открытый файл или устройство;

       тот же указатель файла (это означает, что изменение одного указателя файла влечет  за собой и изменение другого);

       тот же режим доступа (чтение, запись, чтение/запись).

Для получения копии используются функции:

#include<unistd.h>

int dup(int fd);

int dup2(int fd, int fd2);

При успешном выполнении dup() возвращает новый дескриптор файла - целое неотрицательное число. При успешном выполнении функция dup2() делает дескриптор fd2 копией дескриптора fd и возвращает 0. Если уже имеется открытый файл с дескриптором fd2, то он предварительно закрывается. В случае ошибки обе функции возвращают -1 и устанавливается errno.

Пример:

#include <sys\stat.h>

#include <string.h>

#include <fcntl.h>

#include <unistd.h>

#include <stdio.h>

 

#defineSTDOUT  1 //Значение дескриптора стандартного вывода

 

int main(void)

{

    int fptr, oldstdout;

    charmsg[] = "Это тест";

 

    /* создать файл */

    fptr = open("DUMMY.FIL", O_CREAT | O_RDWR, S_IREAD | S_IWRITE);

 

    if (fptr) {

      /* создать дубликат дескриптора стандартного вывода */

        oldstdout = dup(STDOUT);

 

     /* перенаправить стандартный вывод в DUMMY.FIL путем дублирования дескриптора файла в дескриптор стандартного вывода */

 

     dup2(fptr, STDOUT);

 

     /* закрыть дескриптор файла DUMMY.FIL */

     close(fptr);

 

     /* это будет перенаправлено в DUMMY.FIL */

     write(STDOUT, msg, strlen(msg));

 

     /* восстановить исходное состояние дескриптора стандартного вывода */

     dup2(oldstdout, STDOUT);

 

     /* закрыть дубликат дескриптора для STDOUT */

     close(oldstdout);

    }

    else

        printf("Ошибка при открытии файла!\n");

    return 0;

}

5.13.3. Доступ к файлу

Функции, реализующие системные вызовы ввода/вывода QNX, следующие:

#include<unistd.h>

ssize_t write(int fd, void *buf, size_t nbyte);

ssize_t read(int fd, void *buf, size_t nbyte);

off_t lseek(int fd, off_t offset, int whence);

off_t tell(int fd);

intclose(intfd);

В представленных функциях аргумент fd является дескриптором открытого файла.

Функция write() записывает в файл nbyteбайт из буфера buf и возвращает количество записанных байт.

Функция read() читает из файла nbyte байт и записывает их в буфер buf, возвращает количество считанных.

Функция lseek() смещает указатель позиции файла на величину offset относительно указанной базы whence, которая может принимать значения: SEEK_SET– от начала файла, SEEK_END– от конца файла, SEEK_CUR– от текущей позиции. Возвращает новое значение позиции.

Функция tell() возвращает текущее значение позиции файла (указателя файла).

Функция close() закрывает файл и возвращает нулевое значение. Все функции в случае ошибки возвращают -1 и устанавливают errno.

6. Функции управления файловой системой

6.1. Смена корневого каталога

Процесс может изменить свой корневой каталог с помощью системного вызова:

#include<unistd.h>

int chroot(const char *path);

Функция chroot() делает каталог path корневым каталогом. После этого поиск файлов с абсолютными именами, начинающимися с '/', будет производиться, начиная с каталога, указанного аргументом path. Заметим, однако, что пользовательский текущий каталог сохраняется.

Для изменения корневого каталога значение эффективного пользовательского ID процесса (EUID) должно соответствовать системному администратору. Системная жесткая ссылка "..", входящая в корневой каталог, указывает на него самого. В связи с этим жесткая ссылка ".." не может быть использована для доступа к файлам за пределами поддерева, входящего в корневой каталог.

При успешном завершении функция возвращает 0. В случае ошибки возвращается -1 и устанавливается errno.