Я знаю, что этот вопрос часто задают, но я все еще не понимаю, как решить мою проблему. Я попытался написать код, который обрабатывает ввод командной строки для возможности нескольких каналов. Однако у меня ничего не получается, и мой код, хотя и выполняется, работает неправильно. Ошибка заключается в том, что после того, как я разветвил дочерние элементы, я не могу перейти к следующей команде, к которой переходит канал после выполнения самой первой команды. Как перейти к следующей команде в конвейере, не захватывая неправильные файловые дескрипторы? Вот кусок кода;
a = 0;
while (a < cmdnum)
{
pid[a] = fork();
if( pid[a] == 0)
{
if( a == 0)
{
close(1);
dup(p1_to_pn[a][1]);
for( k = 0; k < nump; k++)
{
close(p1_to_pn[k][0]);
close(p1_to_pn[k][1]);
}
args = tokenize(cmd[a]);
execv(args[0], args);
}
else if ( a == (cmdnum-1))
{
close(0);
dup(p1_to_pn[a][0]);
for( k = 0; k < nump; k++)
{
close(p1_to_pn[k][0]);
close(p1_to_pn[k][1]);
}
args = tokenize(cmd[a]);
i = execv(args[0], args);
}
else
{
close(0);
dup(p1_to_pn[a][0]);
close(1);
dup(p1_to_pn[a][1]);
for( k = 0; k < nump; k ++)
{
close(p1_to_pn[k][0]);
close(p1_to_pn[k][1]);
}
args = tokenize(cmd[a]);
execv(args[0], args);
}
}
a++;
}