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


Авторские права

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

Здесь можно скачать бесплатно "Майкл Джонсон - Разработка приложений в среде Linux. Второе издание" в формате fb2, epub, txt, doc, pdf. Жанр: Программное обеспечение, издательство Вильямс, год 2007. Так же Вы можете читать книгу онлайн без регистрации и SMS на сайте LibFox.Ru (ЛибФокс) или прочесть описание и ознакомиться с отзывами.
Майкл Джонсон - Разработка приложений в среде Linux. Второе издание
Рейтинг:
Название:
Разработка приложений в среде Linux. Второе издание
Издательство:
Вильямс
Год:
2007
ISBN:
978-5-8459-1143-8
Скачать:

99Пожалуйста дождитесь своей очереди, идёт подготовка вашей ссылки для скачивания...

Скачивание начинается... Если скачивание не началось автоматически, пожалуйста нажмите на эту ссылку.

Вы автор?
Жалоба
Все книги на сайте размещаются его пользователями. Приносим свои глубочайшие извинения, если Ваша книга была опубликована без Вашего на то согласия.
Напишите нам, и мы в срочном порядке примем меры.

Как получить книгу?
Оплатили, но не знаете что делать дальше? Инструкция.

Описание книги "Разработка приложений в среде Linux. Второе издание"

Описание и краткое содержание "Разработка приложений в среде Linux. Второе издание" читать бесплатно онлайн.



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

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






Аналогичные изменения потребуется внести и в struct job. Ранее эта структура отслеживала определенное количество программ в задании и количество выполняющихся процессов. Ее новый элемент, stoppedProgs, записывает количество процессов задания, остановленных в данный момент. Он может быть вычислен на основе элементов isStopped дочерних программ, содержащихся в задании, но лучше отслеживать его отдельно. После этого изменения получаем окончательную форму структуры struct job.

45: struct job {

46:  int jobld;         /* номер задания */

47:  int numProgs;      /* количество программ в задании */

48:  int runningProgs;  /* количество выполняющихся программ */

49:  char * text;       /* имя задания */

50:  char * cmdBuf;     /* буфер различных argv */

51:  pid_t pgrp;        /* идентификатор группы процессов задания */

52:  struct childProgram* progs; /* массив программ в задании */

53:  struct job * next; /* для слежения за фоновыми программами */

54:  int stopped Progs; /* количество активных, однако остановленных программ */

55: };

Как и предыдущие версии ladsh, код ladsh4.с игнорирует SIGTTOU. Это делается, чтобы позволить использовать tcsetpgrp() даже тогда, когда оболочка не является процессом переднего плана. Однако поскольку оболочка уже будет поддерживать правильное управление заданиями, дочерним процессам не следует игнорировать сигнал. Как только новый процесс разветвляется с помощью runCommand(), он устанавливает обработчик для SIGTTOU в SIG_DFL. Это позволяет драйверу терминала приостановить фоновые процессы, пытающиеся выполнить запись в терминал или провести с ним еще какие-то действия. Ниже приведен код, который начинается с создания дочернего процесса, где сбрасывается SIGTTOU и выполняется дополнительная работа по синхронизации.

514: pipe(controlfds);

515:

516: if (!(newJob.progs[i].pid = fork())) {

517:  signal(SIGTTOU, SIG_DFL);

518:

519:  close(controlfds[1]);

520:  /* это чтение вернет 0, когда закроется записывающая сторона*/

521:  read(controlfds[0], &len, 1);

522:  close(controlfds[0]);

Канал controlfds используется для приостановки дочернего процесса до того, как оболочка переместит этот процесс в подходящую группу процессов. Закрытием записывающей стороны канала и чтением из считывающей стороны дочерний процесс останавливается до тех пор, пока родительский процесс закроет записывающую сторону, что происходит после вызова setpgid() в строке 546. Этот тип механизма необходим для гарантии того, что дочерний процесс перемещается в группу процессов до происшествия exec(). Если подождать до exec(), то не будет уверенности, что процесс попадет в правильную группу процессов, пока он не начнет доступ к терминалу (который может быть запрещен).

Завершенные дочерние процессы проверяются ladsh два раза. Первый раз это происходит во время ожидания процессов в группе процессов переднего плана. После завершения либо остановки процесса переднего плана ladsh проверяет изменения в состояниях своих фоновых процессов с помощью функции checkJobs(). Обе этих кодовых цепочки необходимо модифицировать с целью обработки остановленных и завершенных дочерних процессов.

Добавление флага WUNTRACED к вызову waitpid(), ожидающему на процессах переднего плана, позволяет заметить также остановленные процессы. Когда процесс скорее останавливается, чем завершается, устанавливается флаг дочернего процесса isStopped и увеличивается номер задания stoppedProgs. Если все программы задания были остановлены, ladsh снова перемещается на передний план и ожидает команды пользователя. Вот как выглядит часть главного цикла ladsh, ожидающая на процессе переднего плана.

708: /* задание выполняется на переднем плане; ожидать его */

709: i = 0;

710: while (!jobList.fg->progs[i].pid ||

711:  jobList.fg->progs[i].isStopped) i++;

712:

713: waitpid(jobList.fg->progs[i].pid, &status, WUNTRACED);

714:

715: if (WIFSIGNALED(status) &&

716:  (WTERMSIG(status) != SIGINT)) {

717:  printf("%s\n", strsignal(status));

718: }

719:

720: if (WIFEXITED(status) || WIFSIGNALED(status)) {

721:  /* дочерний процесс завершен */

722:  jobList.fg->runningProgs--;

723:  jobList.fg->progs[i].pid = 0;

724:

725:  if (!jobList.fg->runningProgs) {

726:   /* дочерний процесс завершен */

727:

728:   removeJob(&jobList, jobList.fg);

729:   jobList. fg = NULL;

730:

731:   /* переместить оболочку на передний план */

732:   if (tcsetpgrp (0, getpid()))

733:    perror("tcsetpgrp");

734:   }

735:  } else {

736:   /* дочерний процесс остановлен */

737:   jobList.fg->stoppedProgs++;

738:   jobList.fg->progs[i].isStopped = 1;

739:

740:   if (jobList.fg->stoppedProgs ==

741:    jobList.fg->runningProgs) {

742:    printf ("\n" JOB_STATUS_FORMAT,

743:     jobList.fg->jobId,

744:     "Остановлен", jobList.fg->text);

745:    jobList.fg = NULL;

746:   }

747:  }

748:

749:  if (!jobList.fg) {

750:   /* переместить оболочку на передний план */

751:   if (tcsetpgrp (0, getpid()))

752:    perror("tcsetpgrp");

753:  }

754: }

Подобным образом фоновые задания могут прерываться с помощью сигналов. Мы снова добавляем WUNTRACED к waitpid(), что проверяет состояния фоновых процессов. После остановки фонового процесса обновляются флаг isStopped и счетчик stoppedProgs, а в случае остановки всего задания выводится сообщение.

Последняя возможность, требуемая для ladsh — перемещение задания между состоянием выполнения на переднем плане, состоянием выполнения в фоне и остановом. Это делается с помощью двух встроенных команд: fg и bg. Они являются ограниченными версиями нормальных команд оболочки, носящих те же имена. Оба принимают один параметр, являющийся номером задания, которому предшествует знак % (для совместимости со стандартными оболочками). Команда fg перемещает определенное задание на передний план, a bg запускает его в фоне.

Обе операции выполняются передачей SIGCONT каждому процессу в активизируемой группе процессов. Поскольку этот сигнал может передаваться каждому процессу с помощью отдельных вызовов kill(), несколько проще передать его всей группе процессов, используя отдельный вызов kill(). Ниже приведена реализация встроенных команд fg и bg.

461: } else if (! strcmp(newJob.progs[0].argv[0], "fg") ||

462:  !strcmp(newJob.progs[0].argv[0], "bg")) {

463:  if (!newJob.progs[0].argv[1] || newJob.progs[0].argv[2]) {

464:   fprintf(stderr,

465:    "%s: ожидался в точности один аргумент\n",

466:   newJob.progs[0].argv[0]);

467:   return 1;

468:  }

469:

470:  if (sscanf(newJob.progs[0].argv[l], "%%%d", &jobNum) != 1)

471:   fprintf(stderr, "%s: ошибочный аргумент '%s'\n",

472:   newJob.progs[0].argv[0],

473:   newJob.progs[0].argv[1]);

474:   return 1;

475:  }

476:

477:  for (job = jobList->head; job; job = job->next)

478:   if (job->jobId == jobNum) break;

479:

480:  if (!job) {

481:   fprintf(stderr, "%s: неизвестное задание %d\n",

482:    newJob.progs[0].argv[0], jobNum);

483:   return 1;

484:  }

485:

486:  if (* new Job.progs[0].argv [0] == 'f') {

487:   /* Перевести это задание на передний план */

488:

489:   if (tcsetpgrp(0, job->pgrp))

490:    perror("tcsetpgrp");

491:   jobList->fg = job;

492:  }

493:

494:  /* Перезапустить процессы в задании */

495:  for (i = 0; i < job->numProgs; i++)

496:   job->progs[i].isStopped = 0;

497:

498:  kill (-job->pgrp, SIGCONT);

499:

500:  job->stoppedProgs = 0;

501:

502:  return 0;

503: }

Управление заданиями — последняя возможность примера ladsh, необходимая для нормального функционирования. В нем до сих пор не хватает многих свойств, присущих регулярным оболочкам, например, переменные оболочки и окружения, однако он иллюстрирует все низкоуровневые задания, выполняемые оболочками. Полный исходный код окончательной версии ladsh доступен в приложении Б.

Глава 16

Терминалы и псевдотерминалы

Устройства, предназначенные для интерактивного использования[107], обладают сходным интерфейсом, который был выведен десятилетия назад для последовательных терминалов TeleType и получил название tty. Интерфейс tty используется для доступа к последовательным терминалам, консолям, терминалам xterm, сетевым регистрационным именам и тому подобному.


На Facebook В Твиттере В Instagram В Одноклассниках Мы Вконтакте
Подписывайтесь на наши страницы в социальных сетях.
Будьте в курсе последних книжных новинок, комментируйте, обсуждайте. Мы ждём Вас!

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

Книги похожие на "Разработка приложений в среде Linux. Второе издание" читать онлайн или скачать бесплатно полные версии.


Понравилась книга? Оставьте Ваш комментарий, поделитесь впечатлениями или расскажите друзьям

Все книги автора Майкл Джонсон

Майкл Джонсон - все книги автора в одном месте на сайте онлайн библиотеки LibFox.

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

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

Отзывы читателей о книге "Разработка приложений в среде Linux. Второе издание", комментарии и мнения людей о произведении.

А что Вы думаете о книге? Оставьте Ваш отзыв.