Основы программирования в Linux
<b>#include <stdio.h></b><b>char *tmpnam(char *s);</b>Функция
возвращает допустимое имя файла, не совпадающее с именем любого из существующих файлов. Если строкаtmpnamне равнаs, в нее будет записано имя файла. Последующие вызовы функции tmpnam будут перезаписывать статическую память, используемую для возвращаемых значений, поэтому важно применять строковый параметр, если функция должна вызываться многократно. Длина строки полагается равной, как минимум,NULL(обычно около 20) символам. ФункцияL_tmpnamможет вызываться в одной программе доtmpnam(не менее нескольких тысяч) раз, и каждый раз она будет генерировать уникальное имя файла.TMP_MAXЕсли, временный файл предполагается использовать немедленно, вы можете одновременно назвать его и открыть с помощью функции
. Это важно, т.к. другая программа может создать файл с именем таким же, как значение, возвращенное функциейtmpfile. Функцияtmpnamустраняет эту проблему полностью.tmpfile<b>#include <stdio.h></b><b>FILE* tmpfile(void);</b>Функция tmpfile возвращает указатель потока, ссылающийся на уникальный временный файл. Файл открыт для чтения и записи (с помощью
с флагомfopen) и будет автоматически удален, когда закроются все ссылки на него.w+В случае возникновения ошибки
вернет указательtmpfileи задаст значение переменнойNULL.errnoДавайте посмотрим эти две функции в действии:
#include <stdio.h>#include <stdlib.h>int main() {char tmpname[L_tmpnam];char* filename;FILE *tmpfp;filename = tmpnam(tmpname);printf("Temporary file name is: %s\n", filename);tmpfp = tmpfile();if (tmpfp) printf("Opened a temporary file OK\n");else perror("tmpfile");exit(0);}Когда вы откомпилируете и выполните программу tmpnam.с, то увидите уникальное имя файла, сгенерированное функцией
:tmpnam$ <b>./tmpnam</b>Temporary file name is: /tmp/file2S64zcOpened a temporary file OKКак это работает
Программа вызывает функцию
для генерации уникального имени временного файла. Если вы хотите его использовать, нужно быстро его открыть, чтобы минимизировать риск того, что другая программа откроет файл с тем же именем. Вызов функцииtmpnamодновременно создает и открывает временный файл, тем самым устраняя этот риск. При компиляции программы, использующей функциюtmpfile, компилятор GNU С может вывести предупреждение о применении этой функции.tmpnamВ некоторых версиях UNIX предлагается другой способ генерации имен временных файлов — с помощью функций
иmktemp. Они поддерживаются и ОС Linux и аналогичны функцииmkstempза исключением того, что вы должны задать шаблон имени временного файла, который предоставляет некоторые дополнительные возможности управления местом хранения и именем файла.tmpnam<b>#include <stdlib.h></b><b>char *mktemp(char *template);</b><b>int mkstemp(char *template);</b>Функция mktemp создает уникальное имя файла на основе заданного шаблона
. Аргументtemplateдолжен быть строкой с шестью завершающими символамиtemplate.Хзаменяет эти символыmktempуникальной комбинацией символов, допустимых в именах файлов. Она возвращает указатель на сгенерированную строку илиХпри невозможности сформировать уникальное имя.NULLФункция
аналогична функцииmkstemp: она создает и открывает временный файл. Имя файла генерируется так же, как в функцииtmpfile, но возвращенный результат — открытый низкоуровневый дескриптор файла.mktempПримечаниеВ ваших собственных программах следует всегда применять функции "создать и открыть"
иtmpfileвместо функцийmkstempиtmpnam.mktempИнформация о пользователе
Все программы в ОС Linux за исключением программы init, запускаются другими программами или пользователями. В главе 11 вы узнаете больше о взаимодействии выполняющихся программ или процессов. Пользователи чаще всего запускают программы из командной оболочки, реагирующей на их команды. Вы видели, что в программе можно определить собственное окружение, просматривая переменные окружения и читая системные часы. Программа может также выяснить данные о пользователе, применяющем ее.
Когда пользователь регистрируется в системе Linux, у него или у нее есть имя пользователя и пароль. После того как эти данные проверены, пользователю предоставляется командная оболочка. В системе у пользователя также есть уникальный идентификатор пользователя, называемый UID (user identifier). Каждая программа, выполняемая Linux, запускается от имени пользователя и имеет связанный с ней UID.
Вы можете настроить выполнение программ так, как будто они запускаются другим пользователем. Если у программы есть свой набор прав доступа для UID, она будет выполняться от имени владельца исполняемого файла. Когда выполнена команда su, программа действует так, как будто она запущена суперпользователем. Затем она проверяет право доступа пользователя, изменяет UID на идентификатор назначенной учетной записи и запускает регистрационную командную оболочку данной учетной записи. Этот прием позволяет программе выполняться от имени другого пользователя и часто используется системными администраторами для выполнения задач технического обслуживания системы.