редактировать половину проблемы была исправлена, и вопрос был отредактирован, чтобы отразить это исправление. Я до сих пор вижу, как это выполняет первую команду в серии каналов.
Я застрял на самой последней вещи в своей оболочке, которую я делаю с нуля. Я хочу иметь возможность разбирать такие команды, как "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»).