Я пытаюсь создать многоуровневый канал, где вводом являются команды Linux (например, ls | sort), а выводом является просто обычный вывод при вводе в консоль Linux (по сути, просто используйте execlp для выполнения команд).
Я пытался создать программу, которая работает на 1 и 2 уровнях, но я не могу заставить работать 2-й уровень, особенно с командой "ls | sort". Программа просто зависает. Я также не знаю, как продолжить дальше и добавить больше уровней (требуется для поддержки 16 всего).
// the function has to return unless the command is "exit"
void process_cmd(char *cmdline) {
// exit program
if (strcmp(cmdline, "exit") == 0) {
printf("The shell program (pid=%d) terminates\n", getpid());
exit(0);
}
// separate the user input into the different commands using another
// defined function
char* strings[MAX_PIPE_SEGMENTS];
int x = 0;
int* numTokens = &x;
tokenize(strings, cmdline, numTokens, "|");
// 1 command
if (*numTokens == 1) {
pid_t pid = fork();
if (pid == 0) {
execlp(strings[0], strings[0], NULL);
} else {
wait(0);
return;
}
}
// 2 commands, this is the problem
int ps[*numTokens];
pipe(ps);
pid_t pid = fork();
if (pid == 0) {
pid_t pid2 = fork();
if (pid2 == 0) {
close(1);
dup2(ps[1], 1);
close(ps[0]);
execlp(strings[0], strings[0], NULL);
} else {
close(0);
dup2(ps[0], 0);
close(ps[1]);
wait(0);
execlp(strings[1], strings[1], NULL);
}
} else {
wait(0);
return;
}
}