Продолжаем эту проблему , но я повторю:
Для выполнения домашнего задания я должен написать базовую оболочку, включая перенаправление. Программа использует readline для запроса ввода, анализирует входную строку и разбивает ее на имя исполняемого файла, аргументы и файл (ы) ввода / вывода, если это применимо. После разбора строки он и дочерние execv () переходят в исполняемый файл, который был передан. Я использую dup2 () для изменения файловых дескрипторов после разветвления и перед execv, но у меня возникла проблема, как только Программа имеет execv'd для нового исполняемого файла. Если в моей оболочке я запускаю ls > foo.out
, я получаю: ls: write error: Bad file descriptor
Вот код моего дочернего процесса (это после fork ()):
int _child(struct command *c){
int ret;
/* When given `ls > foo.out`, these next two lines output:
** c->infile is (null)
** c->outfile is foo.out
*/
printf("c->infile is %s\n",c->infile);
printf("c->outfile is %s\n",c->outfile);
if(c->infile){
int fd = open( c->infile, O_RDONLY);
int _fd_dup = dup2(fd,0);
close(0);
if(_fd_dup != 0){
fprintf(stderr, "Failed to redirect command input.\n");
return 0;
}
}
if(c->outfile){
int fd = open( c->outfile, O_WRONLY | O_CREAT | O_TRUNC, 0600);
int _fd_dup = dup2(fd,1);
close(1);
if(_fd_dup != 1){
fprintf(stderr, "Failed to redirect command output.\n");
return 0;
}
}
Я не получаю сообщение «Не удалось перенаправить вывод команды». ошибка. Как я уже говорил, это домашнее задание, поэтому я не ищу никого, кто мог бы это исправить, а скорее указал мне правильное направление.