2012-05-18 2 views
2

Это очищенный код, который я использую для выполнения команд оболочки.
Хотя isExit всегда 0, и цикл должен работать до тех пор, пока он равен !isExit, моя программа завершается после одного цикла командой ls в качестве аргумента для выполнения.
Есть ли у кого-нибудь идеи? Выход в порядке (ls), но затем программа завершается. Код написан на C, на Eclipse.
Работает на Ubuntu 12, который работает на VM над ОС Windows 7.неожиданное завершение работы программы в цикле

int main() { 
    int numberOfCommands, numOfWords, i, isExit = 0, isBackGround = 0, isSucces; 
    char input[256]; 
    char *cmdAndArgs[256]; 
    char *commands[256]; 
do{ 
    // gets and parses user command... 
    ExecuteCmd(cmdAndArgs); 
    } while (!isExit); 
    return EXIT_SUCCESS; 
} 

void ExecuteCmd(char *cmdAndArgs[]){ 
    pid_t pid; 
    pid = fork(); 
    if (pid != 0) { 
     execvp(cmdAndArgs[0], cmdAndArgs); 
     exit(0); 
    } else { 
     waitpid(pid, &status, 0); 
    } 
} 
+0

Программа может выйти из-за исключения или сбоя. Попробуйте положить 'printf (" isExit =% d ", (int) isExit);' вне цикла while и посмотреть, что-то напечатано. – sashoalm

ответ

7

Вы используете execvp в родительском процессе, а не в дочернем. логика:

pid_t pid; 
pid = fork(); 
if (pid != 0) { 
    execvp(cmdAndArgs[0], cmdAndArgs); 
    exit(0); 
} else { 
    waitpid(pid, &status, 0); 
} 

должен быть отменен в:

pid_t pid; 
pid = fork(); 
if (pid == 0) { /* Child */ 
    execvp(cmdAndArgs[0], cmdAndArgs); 
    exit(0); 
} else if (pid == -1) { 
    perror("fork"); 
} else { 
    waitpid(pid, &status, 0); 
} 

кода возврата из fork() является: -1 == вилка не удалась (использование errno для определения причины). 0 == Я ребенок. > 0 == Я - родитель. См. Раздел reference for fork в разделе RETURN VALUE.

+0

+1. Хорошо поймал. – ArjunShankar

+0

Вот и все !!! Ты гений!!! – choppy

0

Возможно ли, что у вас есть переполнение буфера в // gets and parses user command...? Если вы запишете выделенное пространство, вы можете закончить переписывание значения isExit

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