683:    exit(1);

684:   }

685:  }

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 ', 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(' ' 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. Утилита архивирования, наиболее часто используемая для создания библиотек.

basic regular expression (BRE) — базовое регулярное выражение. Тип выражения для сопоставления строк, используемый утилитой grep.

big-endian — обратный порядок байтов. Многобайтное значение, сохраненное с наиболее значащим байтом в младших адресах памяти, за которым следуют остальные байты в порядке значимости.

blocked signals — блокированные сигналы. Сигналы, которые процесс не намерен принимать. Обычно сигналы блокируются на короткий период времени, пока процесс выполняет важную

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

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

Отметить Добавить цитату