11.7.2. Изменения в коде

11.7.2. Изменения в коде

Как только в parseCommand() будут правильно отражены структуры данных, то запуск команд в правильном порядке становится довольно простым при достаточном внимании к деталям. Прежде всего, мы добавляем цикл в parseCommand() для запуска дочерних процессов, поскольку теперь их может быть множество. Прежде чем войти в цикл, мы устанавливаем nextin и nextout, которые являются файловыми дескрипторами, используемыми в качестве стандартных потоков ввод и вывода для следующего запускаемого процесса. Для начала мы используем те же stdin и stdout, что и оболочка.

Теперь посмотрим, что происходит внутри цикла. Основная идея описана ниже.

1. Если это финальный процесс в задании, убедиться, что nextout указывает на stdout. В противном случае нужно подключить вывод этого задания к входному концу неименованного канала.

2. Породить новый процесс. Внутри дочернего перенаправить stdin и stdout, как указано с помощью nextin, nextout и всех специфицированных ранее перенаправлений.

3. Вернувшись обратно в родительский процесс, закрыть nextin и nextout, используемые только что запущенным дочерним процессом (если только они не являются потоками ввода и вывода самой оболочки).

4. Теперь настроить следующий процесс в задании для приема его ввода из вывода процесса, который мы только что создали (через nextin).

Вот как эти идеи перевести на С.

365: nextin=0, nextout=1;

366: for (i=0; i<newJob.numProgs; i++) {

367:  if ((i+1) < newJob.numProgs) {

368:   pipe(pipefds);

369:   nextout = pipefds[1];

370:   } else {

371:    nextout = 1;

372:   }

373:

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

375:    if (nextin != 0) {

376:     dup2(nextin, 0);

377:     close(nextin);

378:    }

379:

380:    if (nextout != 1) {

381:     dup2(nextout, 1);

382:     close(nextout);

383:    }

384:

385:    /* явное перенаправление перекрывает каналы */

386:    setupRedirections(newJob.progs+i);

387:

388:    execvp(newJob.progs[i].argv[0], newJob.progs[i].argv);

389:    fprintf(stderr, "exec() of %s failed: %s ",

390:     newJob.progs[i].argv[0],

391:    strerror(errno));

392:    exit(1);

393:   }

394:

395:   /* поместить наш дочерний процесс в группу процессов,

396:      чей лидер - первый процесс канала */

397:   setpgid(newJob.progs[i].pid, newJob.progs[0].pid);

398:

399:   if (nextin != 0) close(nextin);

400:   if (nextout != 1) close (nextout);

401:

402:   /* Если больше нет процессов, то nextin - мусор,

403:      но это не имеет значения */

404:   nextin = pipefds[0];

Единственный код, добавленный в ladsh2.с для обеспечения перенаправлений — это функция setupRedirections(), код которой останется неизменным во всех последующих версиях ladsh. Ее задача состоит в обработке спецификаторов struct redirectionSpecifier для дочерних заданий и соответствующей модификации дочерних файловых дескрипторов. Мы рекомендуем просмотреть код этой функции в приложении Б.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Символы форматирования в XML-коде комментариев

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Символы форматирования в XML-коде комментариев Если открыть сгенерированный XML-файл, вы увидите, что элементы будут помечены такими символами, как "M", "T", "F" и т.п. Например:‹member name = "Т:ХmlDоcCar.Car"› ‹summary›  Это тип Car, иллюстрирующий возможности


Роль меток в программном коде CIL

Из книги Энциклопедия разработчика модулей ядра Linux автора Померанц Ори

Роль меток в программном коде CIL Вы. конечно, заметили, что в каждой строке программного кода реализации содержится префикс в форме лексемы IL_XXX: (например, IL_0000: IL_0001: и т.д.). Эти лексемы называются метками кода, и они могут иметь любой вид, какой вы только пожелаете (лишь бы


Изменения

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен


19.2.3.4. Выполняйте контроль ошибок в коде перед выпуском версии

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

19.2.3.4. Выполняйте контроль ошибок в коде перед выпуском версии Под "контролем ошибок" (sanity check) здесь подразумевается использование всех доступных инструментов, обладающих приемлемой способностью к обнаружению ошибок, которые человек склонен пропускать. Чем больше таких


19.2.3.4. Выполняйте контроль ошибок в коде перед выпуском версии

Из книги VBA для чайников автора Каммингс Стив

19.2.3.4. Выполняйте контроль ошибок в коде перед выпуском версии Под "контролем ошибок" (sanity check) здесь подразумевается использование всех доступных инструментов, обладающих приемлемой способностью к обнаружению ошибок, которые человек склонен пропускать. Чем больше таких


Использование информации из окна обозревателя объектов в программном коде

Из книги C++. Сборник рецептов автора Диггинс Кристофер

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


Закладки в программном коде

Из книги Фундаментальные алгоритмы и структуры данных в Delphi автора Бакнелл Джулиан М.

Закладки в программном коде Предположим, сейчас 3 часа ночи. Ваши глаза слипаются, и вас клонит ко сну, но сроки нещадно поджимают, и вы упорно отбиваете на клавиатуре строку за строкой довольно однообразный программный код. Вдруг - прилив вдохновения - вы понимаете, как


Использование в коде объектов Range для работы с ячейками

Из книги Как тестируют в Google автора Уиттакер Джеймс

Использование в коде объектов Range для работы с ячейками Весьма неожиданно, что в Excel нет объекта Cell (Ячейка). Поэтому при написании кода следует руководствоваться следующим подходом: для указания ячейки в VBA-коде используется объект Range. В Excel объект Range может заключать в


13.1. Жесткое кодирование строк в коде Unicode

Из книги Офисный компьютер для женщин автора Пастернак Евгения

13.1. Жесткое кодирование строк в коде Unicode ПроблемаТребуется в исходном файле жестко закодировать строки в коде Unicode, т.е. используя расширенный набор символов.РешениеНачинайте строку с префикса L и затем вводите символы в своем редакторе исходных текстов, как вы это


Что это за странные конструкции $ifdef в коде?

Из книги Разработка ядра Linux автора Лав Роберт

Что это за странные конструкции $ifdef в коде? Все коды примеров, представленных в книге, за несколькими специальным образом помеченными исключениями, будут компилироваться в средах Delphi1, 2, 3, 4, 5 и 6, а также Kylix 1. (Впрочем, должны поддерживаться и будущие версии компиляторов.


О куртуазном коде и вреде эксгибиционизма при трудоустройстве Сергей Голубицкий

Из книги автора

О куртуазном коде и вреде эксгибиционизма при трудоустройстве Сергей Голубицкий Опубликовано 05 июля 2013 Сегодня мы побеседуем на тему социальный сетей в аспекте их пользы и вреда для найма на работу. Поводом для размышлений послужило


Изменения

Из книги автора

Изменения Если изменений в документе много, удобно пользоваться этой группой кнопок.Например, вы видите исправление, и вы с ним согласны. Ставите в него курсор и нажимаете кнопку Принять. Выделение исправления пропадает, и оно органично вписывается в ваш текст.У этой


Блокировки в вашем коде

Из книги автора

Блокировки в вашем коде Обеспечение безопасности кода при SMP-обработке — это не то, что можно откладывать на потом. Правильная синхронизация, блокировки без тупиковых ситуаций, масштабируемость и ясность кода- все это следует учитывать при разработке с самого начала и до


Никаких директив ifdef в исходном коде

Из книги автора

Никаких директив ifdef в исходном коде Использование директив препроцессора ifdef в исходном коде категорически не рекомендуется. Никогда не следует делать чего-нибудь вроде следующего. ...#ifdef CONFIG_FOO foo();#endif ...Вместо этого, если макрос CONFIG_FOO не определен, необходимо