Соединение нескольких операторов только выполняет первую команду - PullRequest
0 голосов
/ 17 мая 2018

редактировать половину проблемы была исправлена, и вопрос был отредактирован, чтобы отразить это исправление. Я до сих пор вижу, как это выполняет первую команду в серии каналов.

Я застрял на самой последней вещи в своей оболочке, которую я делаю с нуля. Я хочу иметь возможность разбирать такие команды, как "finger | tail -n +2 | cut -c1-8 | uniq | sort", и я думаю, что я близко. То, что у меня есть сейчас, когда эта строка представляет собой массив строк, выполняет только часть «палец».

Вот часть кода, которая не работает должным образом, я сократил ее до цикла for и части после:

mypipe[2];
//start out with stdin
oldinfd = 0;


   //run the beginning commands. connect in/out of pipes to eachother.
   for(int i = 0; i < max; i++){

      pipe(mypipe);

      processline(commands[i], oldinfd, mypipe[1]); //doesn't wait on children

      close(mypipe[1]);

      oldinfd = mypipe[0];

   }

   //run the final command, put output into stdout
   processline(commands[max], oldinfd, 1);  //waits on children

   ...

Этот цикл запускает программу и должен выглядеть примерно так:

stdin -> [0] pipe [write] -> [read] pipe [write] -> ... -> [read] pipe [1] -> stdout

Моя функция технологической линии принимает строку ('finger') и exec s. например, processline("finger", 0, 1) запустите команду finger без недостатков. Для целей этого вопроса предположим, что технологическая линия работает отлично, у меня проблемы с тем, как я использую каналы и их запись и чтение заканчивается.

Также с печатными заявлениями я подтвердил, что правильные слова отправляются в правильные части. (цикл for получает «finger», «tail -n +2», «cut -c1-8» и «uniq», в то время как команды [max], которые получает последняя строка, являются «sort»).

...