1

whichコマンドのように機能する POSIX 関数はありますか? つまり、コマンド名を渡すと、$PATHその名前の実行可能ファイルが検索され、コマンドがあれば絶対パスが返されます。

fooより長い説明: 私の POSIX-C アプリケーションは、プロセスがまたはと呼ばれる可能性のあるサブプロセスを起動したいと考えていますbar。私が持っていた最初のアイデアは次のようなものでした(子供の が必要であることを無視してstdin/stdout/stderr):

 system("which foo && foo || which bar && bar");

この一般的なアプローチは好きではありません。これは、プロセス呼び出しに関するすべてのエラーを子プロセスの終了コードとstdout/stderr(アプリケーションでバイナリ ストリームとして必要です!) に押し込むためです。

そのため、または実行可能ファイルwhichを見つけるために、アプリケーション コードでの動作を複製する必要があるようです。適切な POSIX 関数はありますか、それともコード スニペットもありますか?foobar

4

1 に答える 1

1

標準fork/パターンを使用できますが、 2回exec実行するだけです。exec失敗した場合execは、他のプロセスを試してください。

pid_t pid;
pid = fork();
if (pid < 0)
    abort();
if (pid == 0) {
    // child process
    execlp("foo", "foo", "--flag");
    if (errno != ENOENT)
        abort();
    execlp("bar", "bar", "--bar-flags");
    abort();
}
// parent process

execからエラーコードをキャプチャすることで、失敗した理由を正確に見つけることができるため、これはおそらく最も簡単な方法です(foo存在しないため)。

代替案: Cで自分自身を実装することもできます。これは、直接which呼び出すよりも煩わしい場合とそうでない場合があります。which

function which(file)
    path = getenv("PATH")
    for prefix in path
        if access(prefix "/" file, R_OK | X_OK)
            return prefix "/" file
        end if
    end for
    return NULL
end function
于 2012-07-01T08:21:08.317 に答える