2011-08-09 6 views
0

私は学習目的でC言語でシェルを作成していますが、これまではfgets()で文字列を入力し、文字列を "チャンク"に分解してから、これらのチャンクをexeclp()に渡されます。最初のチャンクはコマンドの名前であり、その後のチャンクはコマンドの引数です。Cプログラミング - execlp()ヘルプ?

execlp()呼び出しを除いて、すべてうまく動作します。しかし、私は間違って何をしているのか分かりません。

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

#define MAX_CHUNKS 10 

/*========================================================================== 
* Given a string, Break it down into chunks. Separated by ' ', skipping \n 
* ========================================================================*/ 
int break_down_string(char *input_string, char *pointer_array[MAX_CHUNKS]) 
{ 
     char *p = input_string, buffer[100]={0};//Initialize buffer to zero's. 
     short int index = 0, space_count = 0, i; 


    strncat(p, " ", 1); 

    while (*p != '\0') 
    { 
     if (index == MAX_CHUNKS) break; //End if MAX_CHUNKS chunks taken from string. 
     if (*p == '\n'){ //Skip newline characters. 
      p++; 
      continue; 
      } 

     if (*p == ' ') //Space Detected 
     { 
      if (space_count == 0) 
      { 
       pointer_array[index] = (char *)malloc(sizeof(char) * strlen(buffer) +1); 
       strncpy(pointer_array[index], buffer, strlen(buffer)); 
       strncat(pointer_array[index], "\0", 1); 
       bzero(buffer, sizeof(buffer)); 
       index++; 
      } 
      space_count = 1; 
     } 
     else //Non-Space Detected 
     { 
      if (space_count > 0) space_count = 0; 
      strncat(buffer, p, 1); 
     } 
     p++; 
    } 

pointer_array[index] = NULL; //Set end pointer to NULL for execlp(). 

return 0; 
} 



/*--------------------------------MAIN()-----------------------------------*/ 
int main(void) 
{ 
    char buffer[100]; 
    char *pointer_array[MAX_CHUNKS]; //Array which will hold string chunks 

    fgets(buffer, sizeof(buffer), stdin); 

    break_down_string(buffer, pointer_array); 

    if (fork() == 0) 
    { 
     printf("Child process!\n"); 
     execlp(pointer_array[0], (pointer_array+1), NULL); 
    } 
    else 
    { 
     printf("Parent process!\n"); 
    } 

return 0; 
} 

私は本当にここにこだわっています!

+0

のexeclpが正しく何をしないのですか? –

+0

SOで尋ねて、 'execlp'関数の戻りコードをチェックしないのは本当に簡単ですか? :) –

答えて

2

これは権利ではありません。

char *pointer_array[MAX_CHUNKS]; 
execlp(pointer_array[0], (pointer_array+1), NULL); 

のexeclpはint execlp(const char *file, const char *arg, ...);として宣言されています。警告は、char *が期待される場合はchar **を渡すことができないことを明確にする必要があります。


私は個人的にはexecvpを好む。また、新しいプロセスに多くの引数を渡すこともできます。

/* Make sure the last element of pointer_array is NULL. */ 
execvp(pointer_array[0], pointer_array); 

また、試みることができる:

execlp(pointer_array[0], pointer_array[1], NULL); 
+0

Woaaah、ありがとう! execvpは非常に使いやすいです! ..多分私はexeclp()の使用について忘れてしまうかもしれません –

+0

あなたはexeclpからargv [0]を離れることになります。 'execlp(pointer_array [0]、pointer_array [0]、pointer_array [1]、NULL)'でなければなりません。 – Dave