2011-01-20 13 views
1

外部コマンドを実行するためにexec()またはその変種の1つを使用する必要があるオペレーティングシステムクラスのシェルを構築しています。現在、私はexeclp(command,command_parameters, (char *) NULL)を使用しています。これはコマンドを正常に実行します(例えば、lsが標準のディレクトリリストを返す)が、パラメータのいずれかを解析していないように見える(例えば、mkdir helloを実行すると "hello:missing operand ... hello --help ' 。?。詳しくは)私が行方不明ですC execlp()が正しくパラメータを解析しないstring

  else // Try to handle an external command 
     { 
      char *command_parameters = malloc(sizeof(raw_command)-sizeof(command)); 
      strcpy(command_parameters, raw_command+strlen(command)+1); 
      pmesg(1, "Command is %s.\n", command); 
      pmesg(1, "The command parameters are %s.\n", command_parameters); 
      pid_t pid = fork(); 
      pmesg(1, "Process forked. ID = %i. \n", pid); 
      int status; 
      if (fork < 0) 
      { 
       printf("Could not fork a process to complete the external command.\n"); 
       exit(EXIT_FAILURE); 
      } 
      if (pid == 0) // This is the child process 
      { 
       pmesg(1, "This is the child process, running execlp.\n"); 
       if (execlp(command, command_parameters, (char *) NULL) < 0) 
       { 
        printf("Could not execute the external command.\n"); 
        exit(EXIT_FAILURE); 
       } 
       else { pmesg(1, "Executed the child process.\n"); } 
      } 
      else {while(wait(&status) != pid); } // Wait for the child to finish executing 
      pmesg(1, "The child has finished executing.\n"); 
     } 

pmesg)は、特定のデバッグレベルを特定の文を印刷し、デバッグタグである

おかげで、ここでの問題の

答えて

3

カップル:!

  1. execlp(const char *file, const char *arg, ...)は、引数を分割して別々に渡すことを想定しているため、大きな文字列ではありません。
  2. 最初のarg(const char *fileの後)は、実行している実行可能ファイルの名前で、呼び出されるプログラムではとなります。したがって、最初のパラメータは、それ以降に進む必要があります。

例えば:あなたが持っているもので

execlp(command, command, arg1, arg2, ..., (char *)NULL); 

、それが好きでやって:

execlp(command, command, command_parameters, (char *)NULL); 

は、おそらく、そのまま、"mkdir", "hello"であなたの問題の世話をしますが、あなたがしていますまだcommand_parametersの文字列を分割していないので、複数の引数を持つコマンドに対して修正を加えても機能しません。

EDIT:P.S.あなたのライン

if (fork < 0) 

if (pid < 0) 
+0

NULLにchar型のポインタをキャストの意味は何でしょうか。あるべき –

関連する問題