2012-04-15 28 views
1

私はexecveにいくつか問題があります。私はbashシェルのように機能するシェルを作ろうとしていますが、forkした子がコマンドを実行する際に問題があります。ここで私は子供のために持っているものです。 。cmdは、私がこのプログラムを実行すると、私はperrorはこのエラーを取得し、しかし、ユーザーが入力したコマンドを使用してのchar *である:私は簡単なのlsを使用してプログラムを試してみましたexecve - そのようなファイルやディレクトリはありませんか?

execve error: No such file or directory. 

、それは作るべきpath = "/ bin/ls"を実行してください(これは私のlsコマンドがどこにあるか確認しています)。私は間違って何をしていますか?ありがとう!

CODE:

printf ("[%s]\n", path); 

execveへの呼び出しの前に:

if(pid == 0){ 

    // Parse the command 
    char * word = strtok(cmd, " "); 
    char path[128] = "/bin/"; 
    strcat(path, word); 

    // Execute the process 
    char * newenvp[] = { NULL }; 
    char * newargv[] = { path, NULL }; 
    ret = execve(path, newargv, newenvp); 
    if(ret == -1){ 
     perror("execve error"); 
    } 

    return EXIT_SUCCESS; 

} 
+0

あなたは 'PATH'あなたはそれがないと思うものを含んでいることを確認しましたか?特に、 'strtok()'は操作上厄介なことをいくつか知られており、ルールで正確に演奏しなければゴミを簡単に作り出すことができます。 – geekosaur

+0

私には間違いがありません。なぜ 'strtok'が正しいことをしていることを確認する' path'の最終的な内容を表示するには 'printf()'を投げないでください。 'execve'呼び出し自体はうまくいきます。 –

+0

なぜ環境を空に設定していますか?おそらく、現在の環境を使うためには普通の 'execv()'を使うべきでしょうし、 'execve()'の第3引数として 'environ'を渡すべきでしょう。私はこれがあなたの問題の原因であるかどうか疑問ですが、それはより良い習慣です。 (また、 'execv(newargv [0]、newargv);または' execve(newargv [0]、newargv、environ); 'を使用することはしばしば賢明です。 'exec *()'関数:返された場合は失敗し、失敗した場合は返されません) –

答えて

4

私はどうなる最初事が挿入するようになります。実行可能ファイルがあなたが思うものであることを確認する必要があります。

あなたのこのコードは、限り、あなたはそれに供給している入力が正しく、実行ファイルが実際に利用可能あるとして大丈夫を探します。たとえば、次の完全なプログラムは、私のDebianボックスで正常に動作します:私は./testprog lsを実行

#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 

int main (int argc, char *argv[]) { 
    if (argc > 1) { 
     char * word = strtok (argv[1], " "); 
     char path[128] = "/bin/"; 
     strcat (path, word); 

     char * newenvp[] = { NULL }; 
     char * newargv[] = { path, NULL }; 
     printf ("[%s]\n", path); 
     int ret = execve (path, newargv, newenvp); 
     if (ret == -1) { 
      perror("execve error"); 
     } 
    } 
    return 0; 
} 

出力、の線に沿って何か:

[/bin/ls] 
kidsshares.ods paxwords birthdays homeloantracking.gnumeric 
shares2011.ods backup0.sh development lexar 
accounts.ods backup1.sh photos  testprog.c 
testprog 
+0

問題を発見しました。 write()でパスを印刷していました。ヌルターミネーターが見つからないという事実を無視しました。 – theeggman85

0

を手動で移動したくない場合正しいバイナリを見つけるためにファイルシステムを介して、execlp(さらにp)があります。 manページから :

The execlp(), execvp(), and execvpe() functions duplicate the actions of the shell in searching for an executable file if the specified filename does not contain a slash (/) character. The file is sought in the colon-separated list of directory pathnames specified in the PATH environment variable. If this variable isn't defined, the path list defaults to the current directory followed by the list of directories returned by confstr(_CS_PATH). (This confstr(3) call typically returns the value "/bin:/usr/bin".) [...]

関連する問題