Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
$ <b>ls -l /tmp/randwords.big</b> /* Показать размер */-rw-r--r-- 1 arnold devel 204652500 Sep 18 16:02 /tmp/randwords.big$ <b>wc -l /tmp/randwords.big</b> /* Сколько слов? */22713500 /tmp/randwords.big /* Свыше 22 миллионов! */Затем мы отсортировали файл, используя сначала каталог
/tmpTMPDIR/dev/shm$ <b>time sort /tmp/randwords.big > /dev/null</b> /* Использование реальных файлов */real 1m32.566suser 1m23.137ssys 0m1.740s$ <b>time TMPDIR=/dev/shm sort /tmp/randwords.big > /dev/null</b> /* Использование электронного диска */real 1m28.257suser 1m18.469ssys 0m1.602sИнтересно, использование электронного диска было лишь незначительно быстрее, чем использование обычных файлов. (В некоторых дальнейших тестах оно было даже в действительности медленнее!) Мы предполагаем, что в игру вступил буферный кэш ядра (см. раздел 4.6.2 «Создание файлов с помощью
creat()У электронного диска есть важный недостаток: он ограничен сконфигурированным для вашей системы размером пространства для подкачки. [127] Когда мы попытались отсортировать файл, содержащий 1000 копий файла с перемешанными словами, место на электронном диске закончилось, тогда как обычный sort завершился благополучно.
Использовать TMPDIR для своих программ просто. Мы предлагаем следующую схему.
const char template[] = "myprog.XXXXXX";char *tmpdir, *tfile;size_t count;int fd;if ((tmpdir = getenv("TMPDIR")) == NULL) /* Использовать значение TMPDIR, если имеется */ tmpdir = "/tmp"; /* В противном случае, /tmp по умолчанию */count = strlen(tmpdir) + strlen(template) + 2; /* Вычислить размер имени файла */tfile = (char *)malloc(count); /* Выделить для него память */if (tfile == NULL) /* Проверка ошибок */ /* восстановить */sprintf(tfile, "%s/%s", tmpdir, template); /* Создать завершающий шаблон */fd = mkstemp(tfile); /* Создать и открыть файл *//* ...использование tempfile через fd... */close(fd); /* Очистка */unlink(tfile);free(tfile);В зависимости от потребностей вашего приложения, вы можете захотеть немедленно удалить файл после его открытия, вместо его удаления как части завершающей очистки.
12.4. Совершение самоубийства:
abort()Бывают моменты, когда программа просто не может продолжаться. Обычно лучше всего при этом выдать сообщение об ошибке и вызвать
exit()abort()#include <stdlib.h> /* ISO С */void abort(void);Функция
abort()SIGABRTSIGABRTSIGABRTПримером
abort()assert()assert()abort()В соответствии со стандартом С, осуществляет
abort()<stdio.h> FILE*12.5. Нелокальные переходы
«Идите прямо в тюрьму. Не проходите GO. Не забирайте 200$».
Вы, без сомнения, знаете, чем является
gotogotogotoclean_upgotoОператор
gotogotoПочему полезен нелокальный переход? Рассмотрите интерактивную программу, которая считывает и выполняет программы. Предположим, пользователь запускает длительное задание, разочаровывается или меняет мнение о данном задании и нажимает CTRL-С для генерирования сигнала
SIGINT