if (tmpfp) printf("Opened a temporary file OK\n");
else perror("tmpfile");
exit(0);
}
Когда вы откомпилируете и выполните программу tmpnam.с, то увидите уникальное имя файла, сгенерированное функцией tmpnam
:
$ ./tmpnam
Temporary file name is: /tmp/file2S64zc
Opened a temporary file OK
Как это работает
Программа вызывает функцию tmpnam
для генерации уникального имени временного файла. Если вы хотите его использовать, нужно быстро его открыть, чтобы минимизировать риск того, что другая программа откроет файл с тем же именем. Вызов функции tmpfile
одновременно создает и открывает временный файл, тем самым устраняя этот риск. При компиляции программы, использующей функцию tmpnam
, компилятор GNU С может вывести предупреждение о применении этой функции.
В некоторых версиях UNIX предлагается другой способ генерации имен временных файлов — с помощью функций mktemp
и mkstemp
. Они поддерживаются и ОС Linux и аналогичны функции tmpnam
за исключением того, что вы должны задать шаблон имени временного файла, который предоставляет некоторые дополнительные возможности управления местом хранения и именем файла.
#include
char *mktemp(char *template);
int mkstemp(char *template);
Функция mktemp создает уникальное имя файла на основе заданного шаблона template
. Аргумент template
должен быть строкой с шестью завершающими символами Х
. mktemp
заменяет эти символы Х
уникальной комбинацией символов, допустимых в именах файлов. Она возвращает указатель на сгенерированную строку или NULL
при невозможности сформировать уникальное имя.
Функция mkstemp
аналогична функции tmpfile
: она создает и открывает временный файл. Имя файла генерируется так же, как в функции mktemp
, но возвращенный результат — открытый низкоуровневый дескриптор файла.
В ваших собственных программах следует всегда применять функции "создать и открыть" tmpfile
и mkstemp
вместо функций tmpnam
и mktemp
.
Информация о пользователе
Все программы в ОС Linux за исключением программы init, запускаются другими программами или пользователями. В
Когда пользователь регистрируется в системе Linux, у него или у нее есть имя пользователя и пароль. После того как эти данные проверены, пользователю предоставляется командная оболочка. В системе у пользователя также есть уникальный идентификатор пользователя, называемый UID (user identifier). Каждая программа, выполняемая Linux, запускается от имени пользователя и имеет связанный с ней UID.
Вы можете настроить выполнение программ так, как будто они запускаются другим пользователем. Если у программы есть свой набор прав доступа для UID, она будет выполняться от имени владельца исполняемого файла. Когда выполнена команда su, программа действует так, как будто она запущена суперпользователем. Затем она проверяет право доступа пользователя, изменяет UID на идентификатор назначенной учетной записи и запускает регистрационную командную оболочку данной учетной записи. Этот прием позволяет программе выполняться от имени другого пользователя и часто используется системными администраторами для выполнения задач технического обслуживания системы.
Поскольку UID — это ключевой параметр для идентификации пользователя, начнем с него.
У UID есть свои тип uid_t
, определенный в файле sys/types.h. Обычно это короткое целое (small integer). Одни идентификаторы пользователя заранее определены системой, другие создаются системным администратором, когда новые пользователи становятся известны системе. Как правило, идентификаторы пользователей имеют значения, большие 100.
#include
#include
uid_t getuid (void);
char *getlogin(void);
Функция getuid
возвращает UID, с которым связана программа. Обычно это UID пользователя, запустившего программу.
Функция getlogin
возвращает регистрационное имя, ассоциированное с текущим пользователем.