2017-02-17 17 views
-1

Я пытаюсь написать свою собственную простую оболочку в c. Когда я набираю команду в оболочке (например, ls), я получаю ошибку сегментации (ядро сбрасывается). Возможно, проблема в основных аргументах?Ошибка сегментации (ядро сбрасывается) в моей собственной оболочке в c

Я не могу найти, где проблема.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/wait.h> 
#include <unistd.h> 

#define BUFFER_SIZE 512 



char *readline(void){ 

    char* line; 
    if(!fgets(line, BUFFER_SIZE, stdin)){ 
     exit; 
    } 
    size_t length=strlen(line); 
    if (line[length-1]== '\n'){ 
     line[length-1]='\0'; 
    } 
    if(strcmp(line, "exit") ==0){ 
     exit; 
    } 
    return line; 
} 



char **split_line(char *line){ 
    char* tokens[100]; 
    char* token; 
    int i=0; 

    token=strtok(line," "); 

    while(token !=NULL){ 
     tokens[i] = token; 
     token=strtok(NULL, " "); 
    } 
    tokens[i]=NULL; 
    return tokens; 
} 



int exec_line(char **args){ 
    pid_t pid, wpid; 
    char path[40]; 
    int status; 

    strcpy(path, "/bin/"); 
    strcat(path, args[0]); 

    pid=fork(); 
    if(pid==0){ 
     if (execvp(path, args)== -1){ 
      printf("Child process could not do execvp \n"); 
     } 
     exit(EXIT_FAILURE); 

    }else{ 
     do{ 
      wpid=waitpid(pid, &status, WUNTRACED); 
     }while (!WIFEXITED(status) && !WIFSIGNALED(status)); 
    } 
    return 1; 

} 


void lloop(void){ 
     char *line; 
     char **args; 
     int status; 

     do{ 
       printf("my_shell> "); 
       line=readline(); 
       args=split_line(line); 
       status=exec_line(args); 

       free(line); 
       free(args); 
     }while(status); 
} 


int main(){ 

     lloop(); 

     return EXIT_SUCCESS; 
} 
+7

'char * line; if (! fgets (строка, BUFFER_SIZE, stdin)) ... 'нет выделенной памяти ... сбой. –

+1

Вы должны изучить [правильное форматирование C] (// prohackr112.tk/pcf). Или узнайте, как [полностью обфускать свой код] (// prohackr112.tk/guide/coding/proper-c-obfuscation). –

+1

BTW 'exit;' - синтаксическая ошибка. Это должно быть что-то вроде 'exit (EXIT_FAILURE):' Это был даже ваш код? –

ответ

0

Проблема 1: вы не можете писать exit; вместо exit();

Проблема 2: в строке функции раздельным вы пишете

while(token !=NULL){ tokens[i] = token; token=strtok(NULL, " ");}

без содействия i

Проблема 3: в функции exec_line вы пишете strcat(path, args[0]);

когда args является указателем на строку «», а не реальной «строка».

Проблема 4: никогда не использовать бесплатно на указателе, что вы не дали ему таНос.

malloc функция также записывает в сохраненное место вещи для _free _функции.

это undefined поведение.

+0

Что вы подразумеваете под "без продвижения' i' "? Вы имели в виду, что 'i' никогда не увеличивалось, чтобы индексировать следующий элемент массива? –

+0

Я имею в виду без 'i ++' –