Майкл Джонсон - Разработка приложений в среде Linux. Второе издание

Здесь есть возможность читать онлайн «Майкл Джонсон - Разработка приложений в среде Linux. Второе издание» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: Москва, Год выпуска: 2007, ISBN: 2007, Издательство: Вильямс, Жанр: ОС и Сети, Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Разработка приложений в среде Linux. Второе издание: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Разработка приложений в среде Linux. Второе издание»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Книга известных профессионалов в области разработки коммерческих приложений в Linux представляет собой отличный справочник для широкого круга программистов в Linux, а также тех разработчиков на языке С, которые перешли в среду Linux из других операционных систем. Подробно рассматриваются концепции, лежащие в основе процесса создания системных приложений, а также разнообразные доступные инструменты и библиотеки. Среди рассматриваемых в книге вопросов можно выделить анализ особенностей применения лицензий GNU, использование свободно распространяемых компиляторов и библиотек, системное программирование для Linux, а также написание и отладка собственных переносимых библиотек. Изобилие хорошо документированных примеров кода помогает лучше усвоить особенности программирования в Linux.
Книга рассчитана на разработчиков разной квалификации, а также может быть полезна для студентов и преподавателей соответствующих специальностей.

Разработка приложений в среде Linux. Второе издание — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Разработка приложений в среде Linux. Второе издание», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

1: /* sicode.с */

2:

3: #include

4: #include

5: #include

6: #include

7:

8: #ifndef SI_TKILL

9: #define SI_TKILL -6

10: #endif

11:

12: void handler(int signo, siginfo_t *info, void *f ) {

13: static int count = 0;

14:

15: printf("перехвачен сигнал, отправленный ");

16: switch(info->si_code) {

17: case SI_USER:

18: printf("kill()\n"); break;

19: case SI_QUEUE:

20: printf("sigqueue()\n"); break;

21: case SI_TKILL:

22: printf("tkill() или raise()\n"); break;

23: case CLD_EXITED:

24: printf ("ядро сообщает, что дочерний процесс завершен\n"); exit(0);

25: }

26:

27: if (++count == 4) exit(1);

28: }

29:

30: int main() {

31: struct sigaction act;

32: union sigval val;

33: pid_t pid = getpid();

34:

35: val.sival_int = 1234;

36:

37: act.sa_sigaction = handler;

38: sigemptyset(&act.sa_mask);

39: act.sa_flags = SA_SIGINFO;

40: sigaction(SIGCHLD, &act, NULL);

41:

42: kill(pid, SIGCHLD);

43: sigqueue(pid, SIGCHLD, val);

44: raise(SIGCHLD);

45:

46: /* Чтобы получить SIGCHLD от ядра, мы создаем дочерний процесс

47: и немедленно завершаем его. Обработчик сигнала выйдет после

48: получения сигнала от ядра, поэтому мы просто засыпаем

49: на время и позволяем программе прерваться подобным образом. */

50:

51: if (!fork()) exit(0);

52: sleep(60);

53:

54: return 0;

55: }

Если si_codeравно SI_USER, SI_QUEUEили SI_TKILL, то доступны два дополнительных члена siginfo_t: si_pidи si_uid, которые представляют идентификатор процесса, пославшего сигнал и действительный идентификатор пользователя этого процесса.

Когда ядром посылается SIGCHLD, доступны члены si_pid, si_status, si_utimeи si_stime. Первый из них, si_pid, задает идентификатор процесса, состояние которого изменилось [72] Вспомните, что SIGCHLD посылается не только при завершении дочернего процесса, но и при его приостановке или возобновлении работы. . Информация о новом состоянии доступна как в si_code(как показано в табл. 12.3) и в si_status, что идентично целому значению состояния, возвращаемому семейством функций wait().

Последние два члена, si_utimeи si_stime, определяют период времени, которое потрачено дочерним приложением на работу в пользовательском режиме и в режиме ядра, соответственно (это подобно тому, что возвращают вызовы wait3()и wait4()в структуре struct rusage). Это время измеряется в тиках часов, заданных целым числом. Количество тиков в секунду задает макрос _SC_CLK_TCK, определенный в .

SIGSEGV, SIGBUS, SIGILLи SIGFPE— все они представляют si_addr, специфицирующий адрес, который вызвал сбой, описанный si code.

Ниже приведен простой пример проверки контекста сигнала. Он устанавливает обработчик сигнала для SIGSEGV, который печатает контекст сигнала и прерывает процесс. Нарушение сегментации генерируется попыткой обращения к NULL.

1: /* catch-segv.c */

2:

3: #include

4: #include

5: #include

6:

7: void handler(int signo, siginfo_t *info, void *f) {

8: printf("перехват");

9: if (info->si_signo == SIGSEGV)

10: printf("segv accessing %p", info->si_addr);

11: if (info->si_code == SEGV_MAPERR)

12: printf("SEGV_MAPERR");

13: printf("\n");

14:

15: exit(1);

16: }

17:

18: int main() {

19: struct sigactin act;

20:

21: act.sa_sigaction = handler;

22: sigemptyset(&act.sa_mask);

23: act.sa_flags = SA_SIGINFO;

24: sigaction(SIGSEGV, &act, NULL);

25:

26: *((int *)NULL) = 1 ;

27:

28: return 0;

29: }

12.7.2. Отправка данных с сигналом

Механизм siginfo_tтакже позволяет сигналам, которые посылают программы, присоединять к себе один элемент данных (этот элемент может быть указателем, что позволяет неявно передавать любой необходимый объем данных). Чтобы отправить данные, используется union sigval.

#include

union sigval {

int sival_int;

void *sival_ptr;

};

Любой из членов объединения — sival_intили sival_ptr— может быть установлен в требуемое значение, которое включается в siginfo_t, доставляемое вместе с сигналом. Чтобы сгенерировать сигнал с union sigval, должна использоваться функция sigqueue().

#include

void *sigqueue(pid_t pid, int signum, const union sigval value);

В отличие от kill(), pidдолжен быть корректным идентификатором процесса (отрицательные значения не допускаются), signumуказывает номер посылаемого сигнала. Подобно kill(), sigqueue()допускает нулевое значение signumнулю, чтобы проверить, позволяет ли вызывающий процесс посылать целевому сигналы, в действительности не выполняя такой посылки. Последний параметр, value, представляет собой элемент данных, передаваемый вместе с сигналом.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Разработка приложений в среде Linux. Второе издание»

Представляем Вашему вниманию похожие книги на «Разработка приложений в среде Linux. Второе издание» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Геше Джампа Тинлей - Лоджонг (второе издание)
Геше Джампа Тинлей
Алексей Филатов - Люди «А». Второе издание
Алексей Филатов
Отзывы о книге «Разработка приложений в среде Linux. Второе издание»

Обсуждение, отзывы о книге «Разработка приложений в среде Linux. Второе издание» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x