Мне нужно написать что-то вроде небольшого интерпретатора команд. Пишу используя execvp, каждую команду обрабатываю в отдельном процессе. Нужно еще реализовать перенаправление вывода команды в файл(т.е. как > в баше). Предполагаю, что это делается через pipe, но я не смог с ним разобраться. Объясните, пожалуйста, как им правильно воспользоваться, чтобы прочитать вывод команды, вызываемой через execvp.
ЗЫ Вот уже существующий код:
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char * argv[], char * envp[])
{
while (1)
{
pid_t p;
char command[512];
char * args[32];
char * pch;
int i = 0;
printf("%s$ ", getcwd(command, 512));
fgets(command, 512, stdin);
command[strlen(command) - 1] = '\0';
for (
i = 0, args[0] = strtok(command, " ");
args[i] != NULL;
i++, args[i] = strtok(NULL, " ")
) {};
p = fork();
if ( p == 0 )
{
execvp(args[0], args);
if (strcmp(args[0], "exit") != 0 && strcmp(args[0], "cd") != 0) fprintf(stderr, "%s : error : command error\n", argv[0]);
return 1;
}
else if ( p > 0 )
{
if (strcmp(args[0], "exit") == 0)
{
wait(p);
exit(EXIT_SUCCESS);
return 0;
}
else if (strcmp(args[0], "cd") == 0)
{
if (chdir(args[1]) != 0)
{
fprintf(stderr, "%s : error : change dir error\n", argv[0]);
//return 1;
}
}
wait(p);
}
else if ( p == -1)
{
fprintf(stderr, "%s : error : cannot create child process\n", argv[0]);
return 1;
}
}
return 0;
}