2017-02-17 9 views
-1

私は自分のシンプルなシェルをcで書くつもりです。 シェルにコマンド(例えばls)を入力すると、セグメンテーションフォルト(コアダンプ)が発生します。 問題はメインの議論にあるのでしょうか?自分自身のシェルのセグメンテーションフォールト(コアダンプされた)

問題のある場所が見つかりません。

#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(line、BUFFER_SIZE、stdin))... 'no memory allocated ...クラッシュ。 –

+1

[正しいC書式設定](// prohackr112.tk/pcf)を調べてください。または、コードを徹底的に難読化する方法を学んでください(// prohackr112.tk/guide/coding/proper-c-obfuscation)。 –

+1

BTW 'exit;'は構文エラーです。それは 'exit(EXIT_FAILURE);のようなものでなければなりません。 –

答えて

0

問題1:分割ライン機能ではあなたが促進することなく、

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

を書く:あなたが書き込むことはできませんexit;代わり問題2

exit();i

問題3:argsは '文字列' へのポインタではなく、本当の '文字列' の場合exec_line機能であなたはstrcat(path, args[0]);

を書きます。

問題4:あなたが彼にのmallocを与えなかったポインタに無料を使用することはありません。

malloc機能は、_free_functionのために保存された場所にも書き込みます。

これは、の未定義の動作です。

+0

「私は」「あなたを促進せずに」とはどういう意味ですか? 'i'が次の配列要素のインデックスにインクリメントされたことはありませんでしたか? –

+0

私は 'i ++'なし –

関連する問題