2014-12-10 5 views
0

Я пытаюсь создать программу, которая запускает команды с пользовательского ввода.
На данный момент он работает для нескольких команд слов, но я пытаюсь реализовать перенаправления.
Я начал с ввода ввода из файла, и он не работает, но я не получаю никакой ошибки (я тестирую с помощью команды wc -l < text.txt, файл text.txt - это тот же каталог . как программа)
Вот код:
- вход НТР с входом пользователя
- до прихода к этому методу я уже проверил, что он имеет перенаправление на немПопытка прочитать из файла

redirect(int proc, char * input){ 
    char * comm; 
    if(proc == 1){ //in 
     comm = strsep(&input, "<"); 
    } 
    else{ //out 
     comm = strsep(&input, ">"); 
    } 

    int proc2 = check(input); 
    if(proc2 == 0){ //only one redirection 
     if(proc == 1){ //in 
      input = trim(input); 
      int fd = open(input, O_RDWR); 
      close(0); 
      dup2(fd, 0); 
      close(fd); 

      comm = trim(comm); 
      char ** words = parse(comm); 

      char str[105]; 
      strcpy(str, "/bin/"); 
      strcat(str, words[0]); 
      shrink(str); 
      if(!execvp(str, words)){ /*exec failed */ 
       exit(1); 
      } 
     } 
     else{ //out 

     } 
    } 
    else{ //more than one redirection/pipe 

    } 
} 

редактировать
Мне нужно использовать команду execvp для запуска пользователя i Nput.
Пользовательская команда «<» должна изменить stdin как файл после него.
Я изменил stdin как text.txt, но я не знаю, как передать его как arg, поэтому execvp может его запустить.

ответ

0

После долгих испытаний и исследований я обнаружил, что файл, который я использовал не имел разрешения, необходимые для execvp прочитать его от нее.
Я понял это, когда написал код для записи в файл, а затем попытаюсь прочитать этот вновь созданный файл, и он сработал (после добавления флагов).
Вот код:

redirect(int proc, char * input){ 
    char * comm; 
    if(proc == 1){ //in 
     comm = strsep(&input, "<"); 
    } 
    else{ //out 
     comm = strsep(&input, ">"); 
    } 

    int proc2 = check(input); 
    if(proc2 == 0){ //only one redirection 
     if(proc == 1){ //in 
      input = trim(input); 
      int fd = open(input, O_RDWR); 
      close(0); 
      dup2(fd, 0); 
      close(fd); 

      comm = trim(comm); 
      char ** words = parse(comm); 

      if(!execvp(words[0], words)){ /*exec failed */ 
       exit(1); 
      } 
     } 
     else{ //out 
      input = trim(input); 
      int fd = open(input, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR); 
      dup2(fd, 1); 
      close(fd); 

      comm = trim(comm); 
      char ** words = parse(comm); 

      if(!execvp(words[0], words)){ /*exec failed */ 
       exit(1); 
      } 
     } 
    } 
    else{ //more than one redirection/pipe 

    } 
} 

Так что я запустить команду «LS> text.txt», и это создает файл text.txt с «LS» результатов в нем, а затем запустить «туалет -l < text.txt "и возвращает строки в файле.

0

Какие типы команд вы пытаетесь выполнить? , если ваши команды являются командами dos, вы можете читать входы пользователя в строковой переменной и когда вы хотите выполнить файл. создайте файл bat, затем выполните его по следующему коду

Process.Start («ваш путь к файлу»);

+0

Это проект, который я делаю. Я не могу использовать файл bat. Мне нужно изменить stdin как файл. – Mark

0

Если это просто выполнение пользователем указанных команд, то для выполнения команд оболочки вы можете использовать вызов system(). Эта функция принимает команду для выполнения в качестве аргумента и выполняет ее в командной оболочке. Вам не нужно будет создавать отдельный файл.

Вы можете взять команду, которую пользователь хочет выполнить как строка, а затем передать ее в system() в качестве аргумента для ее выполнения. т.е.

system("wc -l < text.txt"); 

System() отлично работает как для Linux и Windows.

Ссылки: Execute a Linux command in the c program

http://www.gnu.org/software/libc/manual/html_node/Running-a-Command.html

+0

Этот ответ хорош для моего вопроса, но я не хотел этого. Я отредактирую свой вопрос. – Mark

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