e-knigi.com
Электронные книги онлайн » Компьютеры и Интернет » Программирование » Linux программирование в примерах - Роббинс Арнольд

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

На этом ресурсе Вы можете бесплатно читать книгу онлайн Linux программирование в примерах - Роббинс Арнольд. Жанр: Программирование . На сайте e-Knigi.com Вы можете онлайн читать полную версию книги без регистрации и sms. Так же Вы можете ознакомится с содержанием, описанием, предисловием о произведении
Перейти на страницу:

$ <b>ed -p '&gt; ' sayings</b> /* Запуск ed, '&gt; ' используется как приглашение */

sayings: No such file or directory

&gt; <b>a</b> /* Добавить текст */

Hello, world

Don't panic

<b>^C</b> /* Сгенерировать SIGINT */

? /* Сообщение об ошибке ''один размер подходит всем'' */

&gt; <b>1,$p</b> /* ed возвращается в командную строку */

Hello, world /* '1,$p' prints all the lines */

Don't panic

&gt; <b>w</b> /* Сохранить файл */

25

&gt; <b>q</b> /* Все сделано */

Внутри себя

ed
устанавливает перед циклом команд точку возврата, и обработчик сигнала осуществляет нелокальный переход на эту точку возврата.

12.5.1. Использование стандартных функций:

setjmp()
и
longjmp()

Нелокальные переходы осуществляются с помощью функций

setjmp()
и
longjmp()
. Эти функции используются в двух разновидностях. Традиционные процедуры определены стандартом ISO С:

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

int setjmp(jmp_buf env);

void longjmp(jmp_buf env, int val);

Тип

jmp_buf
определен через
typedef
в
&lt;setjmp.h&gt;
.
setjmp()
сохраняет текущее «окружение» в
env
.
env
обычно является глобальной или статической на уровне файла переменной, так что она может использоваться из вызванной функции. Это окружение включает любую информацию, необходимую для перехода на местоположение, из которого была вызвана
setjmp()
. Содержание
jmp_buf
по своей природе машинно-зависимо; таким образом,
jmp_buf
является непрозрачным типом: тем, что вы используете, не зная, что находится внутри него.

setjmp()
возвращает 0, когда она вызывается для сохранения в
jmp_buf
текущего окружения. Ненулевое значение возвращается, когда с использованием окружения осуществляется нелокальный переход:

jmp_buf command_loop; /* На глобальном уровне */

/* ... затем в main() ... */

if (setjmp(command_loop) == 0) /* Состояние сохранено, продолжить */

 ;

else /* Мы попадаем сюда через нелокальный переход */

 printf(&quot;?n&quot;); /* ed's famous message */

/* ... теперь начать цикл команд ... */

longjmp()
осуществляет переход. Первым параметром является
jmp_buf
, который должен быть инициализирован с помощью
setjmp()
. Второй является целым ненулевым значением, которое
setjmp()
возвращает в первоначальное окружение. Это сделано так, что код, подобный только что показанному, может различить установку окружения и прибытие путем нелокального перехода.

Стандарт С утверждает, что даже если

longjmp()
вызывается со вторым аргументом, равным 0,
setjmp()
по-прежнему возвращает ненулевое значение. В таком случае она возвращает 1.

Возможность передать целое значение и вернуться обратно из

setjmp()
полезна; это позволяет коду уровня пользователя различать причину перехода. Например,
gawk
использует эту возможность для обработки операторов
break
и
continue
внутри циклов. (Язык awk осознанно сделан похожим на С в своем синтаксисе для циклов, с использованием
while
,
do-while
,
for
,
break
и
continue
.) Использование
setjmp()
выглядит следующим образом (из
eval.c
в дистрибутиве
gawk
3.1.3):

507 case Node_K_while:

508  PUSH_BINDING(loop_tag_stack, loop_tag, loop_tag_valid);

509

510  stable_tree = tree;

511  while (eval_condition(stable_tree-&gt;lnode)) {

512   INCREMENT(stable_tree-&gt;exec_count);

513   switch (setjmp(loop_tag)) {

514   case 0: /* обычный не переход */

515    (void)interpret(stable_tree-&gt;rnode);

516    break;

517   case TAG_CONTINUE: /* оператор continue */

518    break;

519   case TAG_BREAK: /* оператор break */

520    RESTORE_BINDING(loop_tag_stack, loop_tag, loop_tag_valid);

521    return 1;

522   default:

523    cant_happen();

524   }

525  }

526  RESTORE_BINDING(loop_tag_stack, loop_tag, loop_tag_valid);

527  break;

Этот фрагмент кода представляет цикл

while
. Строка 508 управляет вложенными циклами посредством стека сохраненных переменных
jmp_buf
. Строки 511–524 выполняют цикл
while
(используя цикл С
while
!). Строка 511 проверяет условие цикла. Если оно истинно, строка 513 выполняет
switch
на возвращаемое значение
setjmp()
. Если оно равно 0 (строки 514–516), строка 515 выполняет тело оператора. Однако, когда
setjmp()
возвращает
TAG_BREAK
или
TAG_CONTINUE
, оператор
switch
обрабатывает их соответствующим образом (строки 517–518 и 519–521 соответственно).

Перейти на страницу:

Роббинс Арнольд читать все книги автора по порядку

Роббинс Арнольд - на сайте онлайн книг e-Knigi.com Вы можете читать полные версии книг автора в одном месте.


Linux программирование в примерах отзывы

Отзывы читателей о книге Linux программирование в примерах, автор: Роббинс Арнольд. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администрация сайта e-Knigi.com


Прокомментировать
Подтвердите что вы не робот:*