Читаем Разработка приложений в среде Linux. Второе издание полностью

В строке 105 после завершения poll() мы проверяем, является ли причиной завершения poll() сигнал SIGWINCH, доставляемый функции sigwinch_handler в строке 20. Если это так, необходимо получить новый размер текущего окна из стандартного ввода и распространить его в pty подчиненного компонента. Установкой размера окна SIGWINCH передается автоматически процессу, работающему на pty; мы не должны явно передавать SIGWINCH этому процессу.

Теперь для сравнения посмотрите, насколько усложняется этот код в случае использования функций, определенных в ptypair.с.

  1: /* ptytest.с */

  2:

  3: #include

  4: #include

  5: #include

  6: #include

  7: #include

  8: #include

  9: #include

 10: #include

 11: #include

 12: #include

 13: #include

 14: #include "ptypair.h"

 15:

 16:

 17: volatile int propagate_sigwinch = 0;

 18:

 19: /* sigwinch_handler

 20: * распространяет изменения размеров окна из входного файлового

 21: * дескриптора на ведущую сторону pty.

 22: */

 23: void sigwinch_handler(int signal) {

 24:  propagate_sigwinch = 1;

 25: }

 26:

 27:

 28: /* ptytest пытается открыть пару pty с запуском оболочки

 29:  * на подчиненной стороне pty.

 30:  */

 31: int main(void) {

 32:  int master;

 33:  int pid;

 34:  char * name;

 35:  struct pollfd ufds[2];

 36:  int i;

 37: #define BUFSIZE 1024

 38:  char buf[1024];

 39:  struct termios ot, t;

 40:  struct winsize ws;

 41:  int done = 0;

 42:  struct sigaction act;

 43:

 44: if ((master = get_master_pty(&name)) < 0) {

 45:  perror("ptypair: не удается открыть ведущее устройство pty");

 46:  exit(1);

 47: }

 48:

 49: /* установить обработчик SIGWINCH */

 50:  act.sa_handler = sigwinch_handler;

 51:  sigemptyset(&(act.sa_mask));

 52:  act.sa_flags = 0;

 53:  if (sigaction (SIGWINCH, &act, NULL) < 0) {

 54:   perror("ptypair: невозможно обработать SIGWINCH");

 55:   exit(1);

 56:  }

 57:

 58:  if (ioctl(STDIN_FILENO, TIOCGWINSZ, &ws) < 0) {

 59:   perror("ptypair: не удается получить размеры окна");

 60:   exit(1);

 61:  }

 62:

 63:  if ((pid = fork()) < 0) {

 64:   perror("ptypair");

 65:   exit(1);

 66:  }

 67:

 68:  if (pid == 0) {

 69:   int slave; /* файловый дескриптор для подчиненного компонента pty*/

 70:

 71:   /* Мы находимся в дочернем процессе */

 72:   close(master);

 73:

 74:   if ((slave = get_slave_pty(name)) < 0) {

 75:    perror("ptypair: не удается открыть подчиненный компонент pty");

 76:    exit(1);

 77:   }

 78:   free(name);

 79:

 80:   /* Мы должны сделать этот процесс лидером группы сеансов,

 81:    * поскольку он выполняется на новом PTY, а функции вроде

 82:    * управления заданиями просто не будут корректно работать,

 83:    * если нет лидера группы сеансов и лидера группы процессов

 84:    * (который автоматически является лидером группы сеансов).

 85:    * Это также разъединяет со старым управляющим tty.

 86:    */

 87:   if (setsid() < 0) {

 88:    perror("невозможно установить лидер сеанса");

 89:   }

 90:

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

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных