Linux программирование в примерах
Linux программирование в примерах читать книгу онлайн
В книге рассмотрены вопросы, связанные с программированием под Linux: файловый ввод/вывод, метаданные файлов, основы управления памятью, процессы и сигналы, пользователи и группы, вопросы интернационализации и локализации, сортировка, поиск и многие другие. Много внимания уделено средствам отладки, доступным под GNU Linux. Все темы иллюстрируются примерами кода, взятого из V7 UNIX и GNU. Эта книга может быть полезна любому, кто интересуется программированием под Linux.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
$ <b>ed -p '> ' sayings</b> /* Запуск ed, '> ' используется как приглашение */sayings: No such file or directory> <b>a</b> /* Добавить текст */Hello, worldDon't panic<b>^C</b> /* Сгенерировать SIGINT */? /* Сообщение об ошибке ''один размер подходит всем'' */> <b>1,$p</b> /* ed возвращается в командную строку */Hello, world /* '1,$p' prints all the lines */Don't panic> <b>w</b> /* Сохранить файл */25> <b>q</b> /* Все сделано */Внутри себя
ed12.5.1. Использование стандартных функций:
setjmp()longjmp()Нелокальные переходы осуществляются с помощью функций
setjmp()longjmp()#include <setjmp.h> /* ISO С */int setjmp(jmp_buf env);void longjmp(jmp_buf env, int val);Тип
jmp_buftypedef<setjmp.h>setjmp()envenvsetjmp()jmp_bufjmp_bufsetjmp()jmp_bufjmp_buf command_loop; /* На глобальном уровне *//* ... затем в main() ... */if (setjmp(command_loop) == 0) /* Состояние сохранено, продолжить */ ;else /* Мы попадаем сюда через нелокальный переход */ printf("?n"); /* ed's famous message *//* ... теперь начать цикл команд ... */longjmp()jmp_bufsetjmp()setjmp()Стандарт С утверждает, что даже если
longjmp()setjmp()Возможность передать целое значение и вернуться обратно из
setjmp()gawkbreakcontinuewhiledo-whileforbreakcontinuesetjmp()eval.cgawk507 case Node_K_while:508 PUSH_BINDING(loop_tag_stack, loop_tag, loop_tag_valid);509510 stable_tree = tree;511 while (eval_condition(stable_tree->lnode)) {512 INCREMENT(stable_tree->exec_count);513 switch (setjmp(loop_tag)) {514 case 0: /* обычный не переход */515 (void)interpret(stable_tree->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;Этот фрагмент кода представляет цикл
whilejmp_bufwhilewhileswitchsetjmp()setjmp()TAG_BREAKTAG_CONTINUEswitch
