2014-10-01 5 views
0

Я пытаюсь построить оболочку на языке C для проекта ОС. Проблема возникает, когда я делаю часть перенаправления. ls работает хорошо, но если сделаю ls > somefile. Это дает мне ошибку «ls: невозможно получить доступ»: нет такого файла или каталога ». Вот та часть моего кодаexecvp, redirecion вывода ls

while(in){ 
      argv[c]=strdup(in); \\in is output of strtok applied on input string 
       in=strtok(NULL,"\n , "); 
      c++; 
      } 
    argv[c]=NULL; 

    int rc=fork(); 
     if(rc==0){ 
     int flag = 0; 
     int index = 0; 
     int i; 
     for(i= 0; i <c;i++) 
     { 
     if(strcmp(argv[i],">") == 0) 
     { 
     flag = 1; 
     index = i+1; 
     } 
     } 
     if(flag == 1) 
     { 
     fclose(stdout); 
     fopen(argv[index],"w+"); 
     } 
     execvp(argv[0],argv); 
    } 
     else if(rc>0){ 
      (void) wait(NULL);} 
    } 
return 0; 
} 

ответ

0

Эта ошибка из ls говорит вам, что вы прошли > в ls в качестве аргумента.

Итак, давайте посмотрим на ваш execvp вызов:

execvp(argv[0],argv); 

Таким образом, вы используете полноту argv в качестве аргументов к породившей ls.

Куда в обработке выше этого вызова вы удаляете аргументы перенаправления, которые вы уже обработали с argv, так что ls не видит их?

Боковое примечание: Предполагаете ли вы, что fopen присвоит ваш недавно открытый файл fd, ранее использованный stdout? Это кажется мне неразумным предположением (даже если оно нормально работает).

О, и ваш отступ может использовать некоторую работу.

+0

Думаю, я видел проблему. Я не удалял аргумент перенаправления. И да, я предполагаю, что fopen назначит дескриптор 1 новому файлу. Я не знаю, как это сделать любым другим способом. @Eten Reisner –

+0

@AnmolYousaf См. ['Man fopen'] (http://linux.die.net/man/3/fopen), там есть еще одна функция, которая вам будет полезна. Также возможно ['man dup'] (http://linux.die.net/man/3/dup). –

+0

Спасибо @EtanReisner –

 Смежные вопросы

  • Нет связанных вопросов^_^