Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект 58 страниц 2002.doc
Скачиваний:
91
Добавлен:
15.06.2014
Размер:
4.07 Mб
Скачать

Маска создания файла

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

filedes = open(“/tmp/f1”, O_CREAT, mode);

filedes = open(“/tmp/f1”, O_CREAT, (~mask) & mode);

т.е. идет логическое побитовое “И”.

#include<sys/types.h>

#include<sys/stat.h>

mode_t umask (mode_t newmask); //изменяет значение маски

mode_t oldu;

if ((oldu = umask(0)) = = -1)

{ printf(“Ошибка сохранения старой маски\n”);

return(-1);

}

if(filedes = open(“/tmp/f1”, O_CREAT) = = -1)

printf(“Ошибка открытия файла\n”);

if (umask(oldu) = = -1)

printf(“Ошибка восстановления маски\n”);

Следует контроллировать корректность завершения системных вызовов.

Программы Oc unix

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

Выполнение программы начинается с создания в памяти её образа и связанных с процессом структур ядра ОС: инициализации и передачи управления инструкциям программы. Завершение программы приводит к освобождению памяти и соответствующих структур ядра. Образ программы в памяти содержит как минимум сегменты инструкций (команд) и данных, созданных компилятором, а также стек, который пользуется программой в ходе выполнения.

Заголовок программы может выглядеть или так:

main (int argc; char *argv[]; char *envp[]) //символьные переменные окружения

или так:

extern char **environ; // глобальная переменная, указывающая на строки с переменными окружения.

main (int argc; char *argv[])

Стандарт ANSI C определяет только два первых параметра, поэтому иногда можно использовать второй вариант.В этом случае внешняя глобальная переменная environ указывает на тот же символьный массив переменных окружения. Переменные окружения передаются программе, и каждая из них представляет символьную строку, которая имеет вид:

<имя перемен.>=<значение переменной>.

Значение переменной окружения можно прочитать или изменить .

#include <stddef.h>

extern chsr ** environ;

main (int argc, char* argv[])

{

int i;

for (i=0;i<8;i++)

{

if (environ[i]!=NULL)

printf(«Строка окружения [%d]: %s \n», i, environ[i]);

};

}

#include <stdlib.h>

char * getenv(const char*name); //получить значение переменной окружения

int putenv (const char*string); // занести значение в переменную окружения

#include <stdio.h>

main(int argc, char *argv[])

{

char *term;

char buf[200], var[200];

if ((term=getenv("TERM"=NULL)

{

printf("Переменная TERM не определена. Введите значение: ");

gets(buf);

sprintf(var,"TERM=%s",buf);

putenv(var);

printf(" %s \n",var);

}

else

{

printf("TERM=%s | Изменить? ",getenv(“TERM”));

gets(buf);

if (buf[0]=='Y' || buf[0]=='y')

{

printf("TERM=%s",buf);

putenv(var);

printf("Новое значение TERM=%s",var);

};

};

}

Вводимое новое значение переменной окружения будет действительно только для данного процесса и порожденных им процессов. После завершения текущего процесса измененная переменная окружения принимает текущее значение.

Переменная окружения позволяет передавать программе какую-либо информацию. Если программа интерактивная, то большую часть информации она получает от пользователя. Возникает вопрос: как программа узнает, где находится пользователь, или на каком терминале работает пользователь, запустивший программу.

При запуске программы на выполнение из командной строки shell для нее автоматически устанавливается три стандартных потока ввода-вывода:

  • для ввода данных(stdin)

  • для вывода данных(stdout)

  • для вывода сообщений об ошибках(stderr)

Начальную информацию о связях файловых дескрипторов этих потоков с конкретным устройством производит терминальный сервер. В большинстве случаев это процесс getty, который открывает специальный файл устройства, связанный с терминалом пользователя и получает соответствующие дескрипторы. Эти потоки наследует командный интерпретатор shell и передает их исходной программе.

По умолчанию все три потока связаны с терминалом пользователя, но также имеется возможность перенаправления. Такой подход позволяет программисту не задумываться о местоположении пользователя, и в то же время обеспечить передачу данных пользователю, запустившему программу.

При компиляции, а затем компоновке программы, редактор устанавливает точку входа в программу на специальную функцию start( ). Эта функция инициализирует процесс, создавая кадр стека, устанавливая значение переменных, и затем вызывает функцию main( ).

Существует несколько способов завершения программы. Основным является возврат из функции main( ) или вызов функции exit( ).