Linux программирование в примерах
Linux программирование в примерах читать книгу онлайн
В книге рассмотрены вопросы, связанные с программированием под Linux: файловый ввод/вывод, метаданные файлов, основы управления памятью, процессы и сигналы, пользователи и группы, вопросы интернационализации и локализации, сортировка, поиск и многие другие. Много внимания уделено средствам отладки, доступным под GNU Linux. Все темы иллюстрируются примерами кода, взятого из V7 UNIX и GNU. Эта книга может быть полезна любому, кто интересуется программированием под Linux.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
10 {11 char buf[200], *cp;12 int offset;1314 /* Пройти через это испытание , чтобы избежать fprintf(). */15 strcpy(buf, "handler: caught signal ");16 cp = buf + strlen(buf); /* cp указывает на завершающий ' ' */17 if (signum > 100) /* маловероятно */18 offset = 3;19 else if (signum > 10)20 offset = 2;21 else22 offset = 1;23 cp += offset;2425 *cp-- = ' '; /* завершить строку */26 while (signum >0) { /* work backwards, filling in digits */27 *cp-- = (signum % 10) + '0';28 signum /= 10;29 }30 strcat(buf, "n");31 (void)write(2, buf, strlen(buf));32 }3334 /* main --- установить обработку сигнала и войти в бесконечный цикл */3536 int main(void)37 {38 (void)signal(SIGINT, handler);3940 for(;;)41 pause(); /* ждать сигнал, см. далее в главе */4243 return 0;44 }Строки 9–22 определяют функцию обработки сигнала (остроумно названную
handler()fprintf()Функция
main()$ <b>ssh solaris.example.com</b> /* Зарегистрироваться на доступной системе Solaris */Last login: Fri Sep 19 04:33:25 2003 from 4.3.2.1.Sun Microsystems Inc. SunOS 5.9 Generic May 2002$ <b>gcc ch10-catchint.c</b> /* Откомпилировать программу */$ <b>a.out</b> /* Запустить ее */<b>^C </b>handler: caught signal 2 /* Набрать ^C, вызывается обработчик */<b>^C</b> /* Попробовать снова, но на этот раз... */$ /* Программа завершается */Поскольку V7 и другие традиционные системы восстанавливают действие сигнала по умолчанию, поэтому когда вы хотите снова получить сигнал в будущем, функция обработчика должна немедленно переустановить саму себя:
void handler(int signum) { char buf[200], *cp; int offset; (void)signal(signum, handler); /* переустановить обработчик */ /* ...оставшаяся часть функции как прежде... */}10.4.2. BSD и GNU/Linux
BSD 4.2 изменила способ работы
signal()$ <b>ch10-catchint</b> /* Запустить программу */handler: caught signal 2 /* Набираем ^C, вызывается обработчик */handler: caught signal 2 /* И снова... */handler: caught signal 2 /* И снова! */handler: caught signal 2 /* Помогите! */handler: caught signal 2 /* Как нам это остановить?! */Quit (core dumped) /* ^, генерирует SIGQUIT. Bay */На системе BSD или GNU/Linux обработчик сигнала не должен дополнительно использовать '
signal(signum, handler)В действительности, POSIX предоставляет функцию
bsd_signal()signal()#include <signal.h> /* XSI, устаревает */void (*bsd_signal(int sig, void (*func)(int)))(int);Это устраняет проблемы переносимости. Если вы знаете, что ваша программа будет работать лишь на системах POSIX, вы можете воспользоваться
bsd_signal()signal()Одно предостережение — эта функция также помечена как «устаревающая», что означает возможность отказа от нее в будущем стандарте. На практике, даже если от нее откажутся, поставщики скорее всего долгое время будут ее поддерживать. (Как мы увидим, функция API POSIX
sigaction()10.4.3. Игнорирование сигналов
Более практично, когда вызывается обработчик сигнала, это означает, что программа должна завершиться и выйти. Было бы раздражающим, если бы большинство программ по получении
SIGINTНапример, рассмотрите программу
sortsortSIGINTsortsort.c
