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

Тут можно читать бесплатно Linux программирование в примерах - Роббинс Арнольд. Жанр: Компьютеры и Интернет / Интернет. Так же Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте Knigogid (Книгогид) или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.

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

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 миллионов! */

Затем мы отсортировали файл, используя сначала каталог /tmp, а затем с TMPDIR, установленным в /dev/shm[125]:

$ <b>time sort /tmp/randwords.big &gt; /dev/null</b>

 /* Использование реальных файлов */

real 1m32.566s

user 1m23.137s

sys 0m1.740s

$ <b>time TMPDIR=/dev/shm sort /tmp/randwords.big &gt; /dev/null</b>

 /* Использование электронного диска */

real 1m28.257s

user 1m18.469s

sys 0m1.602s

Интересно, использование электронного диска было лишь незначительно быстрее, чем использование обычных файлов. (В некоторых дальнейших тестах оно было даже в действительности медленнее!) Мы предполагаем, что в игру вступил буферный кэш ядра (см. раздел 4.6.2 «Создание файлов с помощью creat()»), весьма эффективно ускоряя файловый ввод/вывод[126].

У электронного диска есть важный недостаток: он ограничен сконфигурированным для вашей системы размером пространства для подкачки.[127] Когда мы попытались отсортировать файл, содержащий 1000 копий файла с перемешанными словами, место на электронном диске закончилось, тогда как обычный sort завершился благополучно.

Использовать TMPDIR для своих программ просто. Мы предлагаем следующую схему.

const char template[] = &quot;myprog.XXXXXX&quot;;

char *tmpdir, *tfile;

size_t count;

int fd;

if ((tmpdir = getenv(&quot;TMPDIR&quot;)) == NULL)

 /* Использовать значение TMPDIR, если имеется */

 tmpdir = &quot;/tmp&quot;; /* В противном случае, /tmp по умолчанию */

count = strlen(tmpdir) + strlen(template) + 2;

 /* Вычислить размер имени файла */

tfile = (char *)malloc(count); /* Выделить для него память */

if (tfile == NULL) /* Проверка ошибок */

 /* восстановить */

sprintf(tfile, &quot;%s/%s&quot;, tmpdir, template);

 /* Создать завершающий шаблон */

fd = mkstemp(tfile); /* Создать и открыть файл */

/* ...использование tempfile через fd... */

close(fd); /* Очистка */

unlink(tfile);

free(tfile);

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

12.4. Совершение самоубийства: abort()

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

#include &lt;stdlib.h&gt; /* ISO С */

void abort(void);

Функция abort() посылает сигнал SIGABRT самому процессу. Это случится, даже если SIGABRT заблокирован или игнорируется. После этого осуществляется обычное для SIGABRT действие, которое заключается в создании дампа ядра.

Примером abort() в действии является макрос assert(), описанный в начале данной главы. Когда assert() обнаруживает, что его выражение ложно, он выводит сообщение об ошибке, а затем вызывает abort() для создания дампа ядра.

В соответствии со стандартом С, осуществляет abort() очистку или нет, зависит от реализации. Под GNU/Linux она выполняет очистку: все потоки &lt;stdio.h&gt; FILE* перед завершением программы закрываются. Обратите, однако, внимание, что для открытых файлов, использующих системные вызовы на основе дескрипторов файлов, ничего не делается. (Если открыты лишь файлы или каналы, ничего не нужно делать. Хотя мы не обсуждали это, дескрипторы файлов используются также для сетевых соединений, и оставление их открытыми является плохой практикой.)

12.5. Нелокальные переходы

«Идите прямо в тюрьму. Не проходите GO. Не забирайте 200$».

- Монополия -

Вы, без сомнения, знаете, чем является goto: передачей потока управления на метку где-то в текущей функции. Операторы goto при скупом употреблении могут послужить удобочитаемости и правильности функции (Например, когда все проверки ошибок используют goto для перехода на метку в конце функции, такую, как clean_up, код с этой меткой проводит очистку [закрывая файлы и т.п.] и возвращается.) При плохом использовании операторы goto могут привести к так называемой «лапше» в коде, логику которого становится невозможно отследить.

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

Почему полезен нелокальный переход? Рассмотрите интерактивную программу, которая считывает и выполняет программы. Предположим, пользователь запускает длительное задание, разочаровывается или меняет мнение о данном задании и нажимает CTRL-С для генерирования сигнала SIGINT. Когда запускается обработчик сигнала, он может перейти обратно в начало главного цикла чтения и обработки команд. Строковый редактор ed представляет простой пример этого:

Перейти на страницу:
Вы автор?
Жалоба
Все книги на сайте размещаются его пользователями. Приносим свои глубочайшие извинения, если Ваша книга была опубликована без Вашего на то согласия.
Напишите нам, и мы в срочном порядке примем меры.
Комментарии / Отзывы
    Ничего не найдено.