Практика №1

#include <stddef.h>

#include <fcntl.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <stdio.h>

#include <unistd.h>

#include <errno.h> //подключение заголовочных файлов (см. описание заголовочных файлов)

int main(int argc, char* argv[])

{

char message []="Hello World!\n"; //для записи в файл

int Buffer=sizeof(message); //размер сообщения в байтах(для системного вывова write

int create;

create=creat("helloworld!", S_IRUSR|S_IWUSR|S_IXUSR); //созданим файл с правами rwx

// для владельца

if (create<0) //обработка ошибки,если код завершения создания файла меньше 0 (т. е. //Файл //не создан

{

perror("Error while creating");

exit(1);

}

int writee;

writee=write(create,message,Buffer); //запись в файл, c inode,который хранится в create

//сообщения message, общим размером байт,хранящимся в переменной Buffer

if (writee<0) // обработка ошибки, если запись не удалась

{

perror("Error while writing");

exit(2); //обратите внимание на разные коды завершения

}

int cl;

cl=close(create); //разрыв связи с файлом, inode которого находится в create

printf("Success");

system("ls -l helloworld!"); //выполнение команды ls -l для отображения файла

system("cat helloworld!"); //вывод содержиимого созданного файла

exit(0); //завершение программы с кодом завершения 0 (успех)

}

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

Изучите раздел обработка ошибок и модернизируйте программу, учитывая специфику принимаемых значений для create,write.

Используйте заголовочный файл <errno.h>

Типовые структуры

В рамках системного программирования очень часто приходится работать с типовыми структурами, в частности в рамках ОС файл, каталог, inode ? являются структурами. Поэтому очень важно уметь понимать принципы работы с ними. Ниже приведена типовая структура dirent, реализующая файл каталога, независимый от файловой системы.


                        struct dirent {

                     long d_ino;
                     off_t d_off;
                     unsigned short d_reclen;
                     char *d_name[];
                    };

dirent - входная структура каталога, независимая от файловой системы.

Различные файловые системы могут иметь различные входные структуры каталогов. Структура dirent определяет структуру католога, независящую от файловой системы, которая содержит информацию, общую для входных структур каталогов в различных типах файловых систем.

Здесь d_ino - это номер, уникальный для каждого файла файловой системы. Поле d_off содержит смещение этой структуры каталога в действительном каталоге файловой системы. Поле d_name содержит начало символьного массива, дающего имя этой структуры каталога. Это имя завершается нулем и может содержать самое большее MAXNAMLEN символов. Это реализует структуры каталогов, независимые от файловой системы и являющиеся конструкциями с переменной длиной. Значение d_reclen задает длину записи этой структуры. Эта длина определяется количеством байтов между текущей и следующей структурами, так что следующуя структура оказывается на границе длинного типа.

Обращение к полям структуры и ее объявление:

register struct dirent *dirbuf ; //объявление массива структуры dirent

? dirbuf->d_name ? //обращение к полю d_name структуры dirent

/code

if (strcmp (dirbuf->d_name, "." ) == 0) //пример обращения к полям структуры;

//здесь сравнивается поле с ?.?, библиотечной функцией strcmp() языка С

/code