Вход/Регистрация
Разработка приложений в среде Linux. Второе издание
вернуться

Троан Эрик В.

Шрифт:

686:

687: /* не обращаем внимания на этот сигнал; это просто помеха,

688: не имеющая никакого значения для оболочки */

689: signal(SIGTTOU, SIG_IGN);

690:

691: while (1) {

692: if (!jobList.fg) {

693: /* на переднем плане нет ни одного задания */

694:

695: /* проверяем, не завершилось выполнение какого-либо фонового задания */

696: checkJobs(&jobList);

697:

698: if (!nextCommand) {

699: if (getCommand(input, command)) break;

700: nextCommand = command;

701: }

702:

703: if (!parseCommand(&nextCommand, &newJob, &inBg) &&

704: newJob.numProgs) {

705: runCommand(newJob, &jobList, inBg);

706: }

707: } else {

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: }

755: }

756:

757: return 0;

758: }

Глоссарий

advisory locking — рекомендательное блокирование. Блокирование, которое не применяется принудительно: все процессы, манипулирующие заблокированными файлами, должны явно проверять наличие блокировки.

anonymous mapping — анонимное отображение. Отображение памяти, которое на связано с inode в файловой системе и ограничено приватным использованием внутри процесса.

ar
. Утилита архивирования, наиболее часто используемая для создания библиотек.

  • Читать дальше
  • 1
  • ...
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: