私は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;
}
あなたは 'PATH'あなたはそれがないと思うものを含んでいることを確認しましたか?特に、 'strtok()'は操作上厄介なことをいくつか知られており、ルールで正確に演奏しなければゴミを簡単に作り出すことができます。 – geekosaur
私には間違いがありません。なぜ 'strtok'が正しいことをしていることを確認する' path'の最終的な内容を表示するには 'printf()'を投げないでください。 'execve'呼び出し自体はうまくいきます。 –
なぜ環境を空に設定していますか?おそらく、現在の環境を使うためには普通の 'execv()'を使うべきでしょうし、 'execve()'の第3引数として 'environ'を渡すべきでしょう。私はこれがあなたの問題の原因であるかどうか疑問ですが、それはより良い習慣です。 (また、 'execv(newargv [0]、newargv);または' execve(newargv [0]、newargv、environ); 'を使用することはしばしば賢明です。 'exec *()'関数:返された場合は失敗し、失敗した場合は返されません) –