2014-01-31 4 views
0

Я пишу программу, которая запрашивает у пользователя команду linux bash, а затем сохраняет их в массивах указателей (вроде как char *argv[]). Затем программа должна выполнить проверку, если эта команда является обычной командой bash или командой cd (change directory). Если его команда cd, тогда она должна использовать что-то вроде chdir(). Если команда - это что-то еще, я хочу использовать некоторые варианты системного вызова exec() для выполнения этой команды.Функция chdir() не будет работать. Зачем?

Однако я не с первой частью (chdir()).

int ii=-1 
printf("Enter the command: "); 
fgets(command, 100, stdin); 
command[strlen(command)-1]=0; 
printf("Command = %s\n", command); 


if (command[0]=='c' && command[1]=='d' && command[2]==' ') 
{ 
    printf("I am inside CD now.\n"); 
    cd_dump[0] = strtok(command," "); 
    while(sub_string[++ii]=strtok(NULL, " ") != NULL) 
    { 
     printf("%s\n", sub_string[0]); 
    } 

    chdir(sub_string[0]); 
} 

Edit: Я также попытался следующие, если заявление без удачи.

if (command[0]=='c' && command[1]=='d' && command[2]==' ') 
{ 
    printf("I am inside CD now.\n"); 
    chdir(command+3); 
} 

К сожалению, программа не правда делать то, что я хочу его, и даже после того, как часы, пытаясь решить проблему, я понятия не имею, почему. Что я сделал не так? Также, если я ввожу cd /home/, почему результат вывода в sub_string [0] заканчивается добавлением «Enter key» на выходе? Сохраняет ли strtok ключ Enter в строке?

Любая помощь по этому вопросу очень ценится.

+1

Вы уверены, что хотите 'command [3]' внутри этого, если? (Те, что до этого равны 0 и 1) – FDinoff

+1

fgets работает таким образом. [Функция fgets() должна считывать байты из потока в массив, на который указывает s, до тех пор, пока не будут прочитаны n-1 байты, или *** a будет считан и передан s *** или конец файла (http://pubs.opengroup.org/onlinepubs/009695399/functions/fgets.html) –

+0

Что такое начальное значение 'ii'? Если это не '-1', преинкремент означает, что' sub_string [0] 'не содержит имя каталога. –

ответ

0

Я думаю, что я хотел бы сделать что-то вроде этого:

if (command[0]=='c' && command[1]=='d' && command[2]==' ') 
{ 
    for(i=2, i++, command[i]!=' '); /* Skip to nonspace */ 
    chdir(command+i); 
} 
+0

Не 'chdir (команда + 3)' точно такая же вещь? Я тоже не совсем понимаю этот цикл. когда 'i = 3' в цикле команда' chdir() 'указывает на' command + 3', что происходит после? Когда цикл выходит? –

+0

Это неверно. Ему не хватает каких-либо ';', если 'i ++' должен был быть тестом, он будет« истинным »для, вероятно, многих итераций. –

+0

Рассмотрите, что будет делать chdir (команда + 3), если: 'command =" cd \ x20 \ x20 \ x20 \ x20 \ x20fred "' – user2624417

2

Вызов chdir() влияет только на текущий процесс, а не его родительского процесса.

Если вы chdir() и немедленно выходите, это бессмысленно - оболочка, которую вы вызываете, хранит ее старую cwd. Вот почему cd - это всегда встроенная оболочка.

Использование

char buffer[PATH_MAX]; 
if (getcwd(buffer, sizeof buffer) >= 0) { 
    printf("Old wd: %s\n", buffer); 
} 
chdir(command+3); 
if (getcwd(buffer, sizeof buffer) >= 0) { 
    printf("New wd: %s\n", buffer); 
} 

правильно проверить chdir() работы.

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