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 для дочерних заданий и соответствующей модификации дочерних файловых дескрипторов. Мы рекомендуем просмотреть код этой функции в приложении Б.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Блокировки в вашем коде
Блокировки в вашем коде Обеспечение безопасности кода при SMP-обработке — это не то, что можно откладывать на потом. Правильная синхронизация, блокировки без тупиковых ситуаций, масштабируемость и ясность кода- все это следует учитывать при разработке с самого начала и до
Никаких директив ifdef в исходном коде
Никаких директив ifdef в исходном коде Использование директив препроцессора ifdef в исходном коде категорически не рекомендуется. Никогда не следует делать чего-нибудь вроде следующего. ...#ifdef CONFIG_FOO foo();#endif ...Вместо этого, если макрос CONFIG_FOO не определен, необходимо
Изменения
Изменения Если изменений в документе много, удобно пользоваться этой группой кнопок.Например, вы видите исправление, и вы с ним согласны. Ставите в него курсор и нажимаете кнопку Принять. Выделение исправления пропадает, и оно органично вписывается в ваш текст.У этой
Использование информации из окна обозревателя объектов в программном коде
Использование информации из окна обозревателя объектов в программном коде Обозреватель объектов удовлетворит любое любопытство к объектам в проекте, но, кроме того, он может служить и довольно неплохим средством создания программного кода. После того как вы найдете
Закладки в программном коде
Закладки в программном коде Предположим, сейчас 3 часа ночи. Ваши глаза слипаются, и вас клонит ко сну, но сроки нещадно поджимают, и вы упорно отбиваете на клавиатуре строку за строкой довольно однообразный программный код. Вдруг - прилив вдохновения - вы понимаете, как
Использование в коде объектов Range для работы с ячейками
Использование в коде объектов Range для работы с ячейками Весьма неожиданно, что в Excel нет объекта Cell (Ячейка). Поэтому при написании кода следует руководствоваться следующим подходом: для указания ячейки в VBA-коде используется объект Range. В Excel объект Range может заключать в
Приложение В. Посты из блога об инструментах и коде
Приложение В. Посты из блога об инструментах и коде В этом приложении приведено несколько постов из Google Testing
19.2.3.4. Выполняйте контроль ошибок в коде перед выпуском версии
19.2.3.4. Выполняйте контроль ошибок в коде перед выпуском версии Под "контролем ошибок" (sanity check) здесь подразумевается использование всех доступных инструментов, обладающих приемлемой способностью к обнаружению ошибок, которые человек склонен пропускать. Чем больше таких
19.2.3.4. Выполняйте контроль ошибок в коде перед выпуском версии
19.2.3.4. Выполняйте контроль ошибок в коде перед выпуском версии Под "контролем ошибок" (sanity check) здесь подразумевается использование всех доступных инструментов, обладающих приемлемой способностью к обнаружению ошибок, которые человек склонен пропускать. Чем больше таких
13.1. Жесткое кодирование строк в коде Unicode
13.1. Жесткое кодирование строк в коде Unicode ПроблемаТребуется в исходном файле жестко закодировать строки в коде Unicode, т.е. используя расширенный набор символов.РешениеНачинайте строку с префикса L и затем вводите символы в своем редакторе исходных текстов, как вы это
Символы форматирования в XML-коде комментариев
Символы форматирования в XML-коде комментариев Если открыть сгенерированный XML-файл, вы увидите, что элементы будут помечены такими символами, как "M", "T", "F" и т.п. Например:‹member name = "Т:ХmlDоcCar.Car"› ‹summary› Это тип Car, иллюстрирующий возможности
Роль меток в программном коде CIL
Роль меток в программном коде CIL Вы. конечно, заметили, что в каждой строке программного кода реализации содержится префикс в форме лексемы IL_XXX: (например, IL_0000: IL_0001: и т.д.). Эти лексемы называются метками кода, и они могут иметь любой вид, какой вы только пожелаете (лишь бы
Что это за странные конструкции $ifdef в коде?
Что это за странные конструкции $ifdef в коде? Все коды примеров, представленных в книге, за несколькими специальным образом помеченными исключениями, будут компилироваться в средах Delphi1, 2, 3, 4, 5 и 6, а также Kylix 1. (Впрочем, должны поддерживаться и будущие версии компиляторов.
О куртуазном коде и вреде эксгибиционизма при трудоустройстве Сергей Голубицкий
О куртуазном коде и вреде эксгибиционизма при трудоустройстве Сергей Голубицкий Опубликовано 05 июля 2013 Сегодня мы побеседуем на тему социальный сетей в аспекте их пользы и вреда для найма на работу. Поводом для размышлений послужило