Категории
Самые читаемые
PochitayKnigi » Компьютеры и Интернет » Интернет » Linux программирование в примерах - Роббинс Арнольд

Linux программирование в примерах - Роббинс Арнольд

Читать онлайн Linux программирование в примерах - Роббинс Арнольд

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 166 167 168 169 170 171 172 173 174 ... 253
Перейти на страницу:

  "Here's lookin' at you, kid!"; /* заменяет "hello, world" */

 FILE *fp;

 char buf[BUFSIZ];

 fp = tmpfile();                 /* Получить временный файл */

 fprintf(fp, "%s", mesg);        /* Записать s него */

 fflush(fp);                     /* Сбросить на диск */

 rewind(fp);                     /* Перейти в начало */

 fgets(buf, sizeof buf, fp);     /* Прочесть содержимое */

 printf("Got back <%s>n", buf); /* Вывести полученные данные */

 fclose(fp);                     /* Закрыть файл, закончить */

 return 0;                       /* Все сделано */

}

Возвращенное значение FILE* не отличается от любого другого FILE*, возвращенного fopen(). При запуске получаем ожидавшиеся результаты:

$ <b>ch12-tmpfile</b>

Got back &lt;Here's lookin' at you, kid!&gt;

Ранее мы видели, что авторы GLIBC рекомендуют использование функции mkstemp():

$ <b>cc ch12-mktemp.с -о ch12-mktemp</b> /* Компилировать программу */

/tmp/cc1XCvD9.о(.text+0x35): In function &quot;main':

: the use of 'mktemp' is dangerous, better use 'mkstemp'

Эта функция похожа на mktemp() в том, что она принимает имя файла, оканчивающееся на 'ХХХХХХ', и заменяет эти символы уникальным суффиксом для создания уникального имени файла. Однако, она идет на один шаг дальше. Она создает и открывает файл. Файл создается с доступом 0600 (т.е. -rw-------). Таким образом, доступ к файлу может получить только пользователь, запустивший программу.

Более того, и это то, что делает mkstemp() более безопасной, файл создается с флагом O_EXCL, который гарантирует, что файл не существует, и не дает никому больше открыть файл.

Возвращаемое значение является дескриптором открытого файла, который может использоваться для чтения и записи. Для удаления файла после завершения работы с ним должно использоваться имя пути, сохраненное теперь в переданном mkstemp() буферу. Все это демонстрируется в ch12-mkstemp.c, который является простой модификацией ch12-tmpfile.с:

/* ch12-mkstemp.с --- демонстрирует mkstemp().

   Проверка ошибок для краткости опущена */

#include &lt;stdio.h&gt;

#include &lt;fcntl.h&gt; /* для флагов открытия */

#include &lt;limits.h&gt; /* для PATH_МАХ */

int main(void) {

 static char template[] = &quot;/tmp/myfileXXXXXX&quot;;

 char fname[PATH_MAX];

 static char mesg[] =

  &quot;Here's lookin' at you, kid!n&quot;; /* заменяет &quot;hello, world&quot; */

 int fd;

 char buf[BUFSIZ];

 int n;

 strcpy(fname, template);           /* Копировать шаблон */

 fd = mkstemp(fname);               /* Создать и открыть временный файл */

 printf(&quot;Filename is %sn&quot;, fname); /* Вывести его для сведений */

 write(fd, mesg, strlen(mesg));     /* Что-нибудь записать в файл */

 lseek(fd, 0L, SEEK_SET);           /* Перейти в начало */

 n = read(fd, buf, sizeof(buf));

  /* Снова прочесть данные; НЕ завышается ''! */

 printf(&quot;Got back: %.*s&quot;, n, buf);  /* Вывести его для проверки */

 close(fd);                         /* Закрыть файл */

 unlink(fname);                     /* Удалить его */

 return 0;

}

При запуске получаем ожидавшиеся результаты:

$ <b>ch12-mkstemp</b>

Filename is /tmp/myfileuXFWIN

Got back: Here's lookin' at you, kid!

12.3.3. Использование переменной окружения TMPDIR

Многие стандартные утилиты обращают внимание на переменную окружения TMPDIR, используя обозначенный в ней каталог в качестве места для помещения временных файлов. Если TMPDIR не установлена, каталогом по умолчанию для временных файлов обычно является /tmp, хотя на многих современных системах есть также и каталог /var/tmp. /tmp обычно очищается от всех файлов и каталогов административными сценариями оболочки при запуске.

Многие системы GNU/Linux предоставляют каталог /dev/shm, использующий файловую систему типа tmpfs:

$ <b>df</b>

Filesystem 1K-blocks     Used Available Use% Mounted on

/dev/hda2    6198436  5136020    747544  88% /

/dev/hda5   61431520 27720248  30590648  48% /d

none          256616        0    256616   0% /dev/shm

Тип файловой системы tmpfs предоставляет электронный (RAM) диск: часть памяти, которая используется, как если бы она была диском. Более того, файловая система tmpfs использует механизмы виртуальной памяти ядра Linux для его увеличения сверх фиксированного размера. Если на вашей системе уйма оперативной памяти, этот подход может обеспечить заметное ускорение. Чтобы протестировать производительность, мы начали с файла /usr/share/dict/linux.words, который является отсортированным списком правильно написанных слов, по одному в строке. Затем мы перемешали этот файл, так что он больше не был сортированным, и создали больший файл, содержащий 500 копий спутанной версии файла:

1 ... 166 167 168 169 170 171 172 173 174 ... 253
Перейти на страницу:
Тут вы можете бесплатно читать книгу Linux программирование в примерах - Роббинс Арнольд.
Комментарии