/* восстановить */
sprintf(tfile, "%s/%s", tmpdir, template);
/* Создать завершающий шаблон */
fd = mkstemp(tfile); /* Создать и открыть файл */
/* ...использование tempfile через fd... */
close(fd); /* Очистка */
unlink(tfile);
free(tfile);
В зависимости от потребностей вашего приложения, вы можете захотеть немедленно удалить файл после его открытия, вместо его удаления как части завершающей очистки.
12.4. Совершение самоубийства: abort()
Бывают моменты, когда программа просто не может продолжаться. Обычно лучше всего при этом выдать сообщение об ошибке и вызвать exit()
abort():#include
void abort(void);
Функция abort()
SIGABRT самому процессу. Это случится, даже если SIGABRT заблокирован или игнорируется. После этого осуществляется обычное для SIGABRT действие, которое заключается в создании дампа ядра.Примером abort()
assert(), описанный в начале данной главы. Когда assert() обнаруживает, что его выражение ложно, он выводит сообщение об ошибке, а затем вызывает abort() для создания дампа ядра.В соответствии со стандартом С, осуществляет abort()
FILE* перед завершением программы закрываются. Обратите, однако, внимание, что для открытых файлов, использующих системные вызовы на основе дескрипторов файлов, ничего не делается. (Если открыты лишь файлы или каналы, ничего не нужно делать. Хотя мы не обсуждали это, дескрипторы файлов используются также для сетевых соединений, и оставление их открытыми является плохой практикой.)12.5. Нелокальные переходы
«Идите прямо в тюрьму. Не проходите GO. Не забирайте 200$».
Вы, без сомнения, знаете, чем является goto
goto при скупом употреблении могут послужить удобочитаемости и правильности функции (Например, когда все проверки ошибок используют goto для перехода на метку в конце функции, такую, как clean_up, код с этой меткой проводит очистку [закрывая файлы и т.п.] и возвращается.) При плохом использовании операторы goto могут привести к так называемой «лапше» в коде, логику которого становится невозможно отследить.Оператор goto
goto для выхода из вложенной функции в предшествующую вызывающую функцию. Однако в С нет способа, в пределах синтаксиса самого языка, перейти в определенную точку другой функции, пусть даже и вызывающей. Такой переход называется Почему полезен нелокальный переход? Рассмотрите интерактивную программу, которая считывает и выполняет программы. Предположим, пользователь запускает длительное задание, разочаровывается или меняет мнение о данном задании и нажимает CTRL-С для генерирования сигнала SIGINT
$ ed -p '> ' sayings
sayings: No such file or directory
> a
Hello, world
Don't panic
^C
? /* Сообщение об ошибке ''один размер подходит всем'' */
> 1,$p
Hello, world /* '1,$p' prints all the lines */
Don't panic
> w
25
> q
Внутри себя ed
12.5.1. Использование стандартных функций: setjmp()
longjmp()Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT