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 — блокированные сигналы. Сигналы, которые процесс не намерен принимать. Обычно сигналы блокируются на короткий период времени, пока процесс выполняет важную