0

私の問題を説明しようとします。次のコマンドを実行すると

find ~ -name file.txt

Linux では、名前が付けられたすべてのファイルがfile.txtコンソール画面に表示されます。execlpのような特定の名前を持つすべてのファイルを検索する関数を使用して、同じことを行う C プログラムを作成したいと思いますfile.txt

私がこのようなことをすると:

execlp("find","find","-name","file.txt",NULL); 

file.txt正常にコンパイルされますが、実行時に現在の作業ディレクトリにある名前のファイルのみが表示されます。私のプログラムでこのようなことをすると:

execlp("find","find","~","-name","file.txt"); 

正常にコンパイルされますが、実行時に次のエラーが表示されます。

find: `~': No such file or directory. 

使用可能なすべてのディレクトリでexeclp検索するには、関数にどのパラメーターを指定する必要がありますか? file.txt関数でこれを行う必要がありexeclpます。どうもありがとうございました!

4

1 に答える 1

1

最初の例の「〜」は、カーネルではなくシェルによって展開されます。C でコマンドを実行する場合、シェルを経由しないため、そのような置換が行われることは期待できません。実際にシェルを呼び出してコマンドを実行するように依頼しない限り、execlp("/bin/sh", "/bin/sh", "-c", "find", "~", ...);.

あなたがしていることを実行する好ましい方法は、HOME 環境変数をチェックするか、パスワード データベースから現在のユーザーのホーム ディレクトリを取得することです。方法は次のとおりです。

#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>
#include <stdlib.h>

const char *homedir = getenv("HOME");
if (homedir == NULL) {
    struct passwd *pw = getpwuid(getuid());
    homedir = pw->pw_dir;
}

次に、コード内の "~" 引数を homedir 変数に置き換えます。

于 2013-10-21T17:43:49.843 に答える