私は C で単純なシェルを書いています。実際には、i/o リダイレクトなどとうまくいっています。追加したいことの 1 つは、exec* 関数のバージョンを切り替える方法です。現在、私は execlp()、execvp()、および execve() に固執しています。
argv という配列に渡したいすべての引数があります。これはヌル終了文字列のヌル終了配列であるため、execv* では問題なく動作しますが、execlp() で動作させる方法が思い浮かびません。
これは私が今持っているものです:
if (strcmp(exec_opt, "vp") == 0)
error = execvp(argv[0], argv); /* Execute vp */
else if(strcmp(exec_opt, "lp") == 0)
error = execlp(argv[0], "", argv); /* Execute lp */
else if(strcmp(exec_opt, "ve") == 0)
error = execve(argv[0], argv, environ); /* Execute ve */
else
{
// throw errors about exec_opt
}
if(error != 0)
{
// do something about it
}
この構成では、コンパイラは構文をバフしませんが、機能しません。私も試してみました
error = execlp(argv[0], (char*) argv); /* As a single string */
char* argv1 = argv[1]; /* don't pass command itself */
error = execlp(argv[0], argv1);
さまざまな奇妙なことを行いますが、最終的には正しくありません。配列を可変引数リストに変換する方法はありますか? それを直接渡すと (可変引数リストは であるため、これが最も型的に意味がありますchar* argv[]
)、互換性のないポインターのキャストに関するコンパイラ エラーが発生します。