2016-01-31 2 views
0

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

Вот мой код:

int main(int argc, char *argv[]) 
{ 

char delim[] = ";"; // the semicolon is the commands separator 
    FILE* batchFile; 
char oneLine[512]; 

batchFile = fopen("myfile.txt", "r"); 
int numOfCommands = 0; 
    char *commands[100]; 
char *oneCommand; 
pid_t childPid; 
int child_status; 

if(batchFile == NULL) 
{ 
    perror("Error opening file ... exiting !"); 
    exit(1); 
} 

if(fgets(oneLine,512,batchFile) != NULL) 
{ 
    //puts(mystring); 
    fclose(batchFile); 
} 

printf("The command is: %s \n", oneLine); 

oneCommand = strtok(oneLine,delim); 
commands[numOfCommands++] = strdup(oneCommand); 

while((oneCommand=strtok(NULL, delim))!=NULL) 
{ 
     commands[numOfCommands++] = strdup(oneCommand); 
} 

commands[numOfCommands] = NULL; 

for(int i = 0;i < numOfCommands;i++) 
{ 
    printf("The command is: %s \n",commands[i]); 
} 

for(int i =0;i < numOfCommands;i++) 
{ 
     childPid = fork(); 

    if(childPid == 0) 
    { 
     execvp(commands[i], argv); 
     perror("exec failure"); 
      exit(1); 
    } 
    else 
    { 
     wait(&child_status); 
    } 


} 

return 1; 
} 

и некоторые команды, такие как выход, CD не будет работать, я думаю, может быть, потому что они не находятся в/бен ??

и как это можно исправить?

Мой файл имеет следующую строку

логинсервера; дата; Кэл PWD; CD; Ls -l;

и когда я запускаю свою программу, он выводит следующее.

enter image description here

+0

Вы передаете 'argv':' execvp (команды [I], ARGV); '. Вероятно, вы хотели передать «команды». –

+0

@ I3x Я изменил его, и у меня не было такого файла или каталога, который не найден для каждой отдельной команды. – Pro

+0

Отправьте пример строки, для которой execvp терпит неудачу. Распечатайте команду и аргументы, которые вы передаете 'execvp' для проверки. –

ответ

1

Если вы посмотрите на вывод, он не для cd. Это ожидается, потому что cd - это встроенная оболочка, а не команда . Для cd вы должны использовать chdir(2) вместо execv().

ls -l не работает, потому что такой команды нет. Вам нужно разделить команду еще раз, прежде чем передавать их на execvp().

В принципе, команда, которую вы передать должно быть в форме:

char *cmd[] = {"ls", "-l", 0}; 
execvp(cmd[0], cmd); 
+0

ОК, это информативно. Но как я могу выполнять другие встроенные команды, такие как echo, и вы могли бы показать мне, как использовать chdir() с простым примером. и что такое нуль в char * cmd, я знаю, что ls - это команда, -l - это опция, но что равно нулю? – Pro

+0

Вы передаете путь, который хотите изменить: 'chdir ("/home/usr ");'. '0' - прервать массив, как требуется' execvp() '. Это эквивалентно использованию 'NULL'. –

+0

поэтому 0 должно быть передано для каждой другой исполняемой команды, такой как date, cal, pwd, ls ... и т. Д. ... все, что находится в/bin. а как насчет других встроенных команд, таких как эхо ?? – Pro

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