3

UNIX シェルをプログラミングしていますが、execv()システム コールを使用してプロセスを作成する必要があります。パラメータの 1 つはexecv()、実行可能ファイルのファイルパスです。したがって、誰かが と入力/bin/lsすると、実行可能ファイルがls実行されます。しかし、私が必要としているのは、入力されたときに(コマンドのように)lsファイルパスを検索するような関数です。それを可能にする機能はありますか?lswhich

残念ながら、これは学校のプロジェクトであり、使用を許可されていませんexecvp()。パス検索機能を実装してから、そのファイルパスをexecv()パラメーターに追加する必要があります。

4

9 に答える 9

9

を使用して環境からパス文字列を取得し、次にPATH = getenv("PATH")を連続して呼び出して、文字列から の配列にパスを解析します。この配列はで割り当てる必要があります。++をバッファーに配置し、 を使用して、そのパスの場所でファイルを実行できるかどうかを確認します。実行できる場合は、.strtok(PATH,":")strtok(NULL,":")PATHchar **pathmalloc()path[x]'/'argv[0]access(buffer, X_OK)execv(buffer,argv)

于 2008-09-29T13:33:05.507 に答える
3

execvp() が必要な場合、ファイル名に「/」が含まれていない限り、PATH 変数で指定されたパスを検索します。

于 2008-09-29T00:20:33.883 に答える
3

を使用しexecvpます。

char *args[] = {"ls", (char *) NULL};
execvp("ls", args);

たとえば、この例は実行されます (PATH にあると/bin/echo仮定します)。/bin

#include <unistd.h>

int main()
{
    char *args[] = {"echo", "hello world", (char *) NULL};
    execvp("echo", args);
    return 0;
}
于 2008-09-29T00:27:47.033 に答える
3

execvp を使用できない場合はchar** environ、<unistd.h> またはchar* getenv(const char* name)<stdlib.h> から PATH 変数を取得し、それを使用int access(const char* filename, int mode)してファイルが存在し、実行可能かどうかを確認できます。これは学校のプロジェクトなので、実装はあなたに任せます。

于 2008-09-29T00:29:31.787 に答える
2

でプログラムを実行しようとする前に、access()orを呼び出すことを提案する人が何人かいます。これを行う必要はありません。要求されたファイルを実行できなかった場合、エラーが返されます。stat()execv()execv()

于 2008-09-30T00:38:40.807 に答える
2

execvp() は必要なことを行うと思います。

編集:では、実際にこれを手動で行う方法を尋ねていますか?その場合...

  1. envp で PATH を見つけます (main() の 3 番目の引数)
  2. これを個々のパスに分割します
  3. stat() を使用して、これらのそれぞれでプログラムの存在を確認します
  4. 最初に存在することがわかったものを実行します

または、本当にしっかりした実装が必要な場合は、これを使用してください。ただし、盗作検出器を作動させる可能性があります:)

于 2008-09-29T00:18:50.347 に答える
0

execvp:-)

編集:わかりました。これは、問題の疑似コードとして機能する Perl バージョンです。

use List::Util qw(first);

my @path = split /:/, $ENV{PATH};
my $dir = first {$_ ||= '.'; -x "$_/$name"} @path
    or die "Can't find program $name\n";
exec "$dir/$name", @args;

split指定されたセパレータを使用して、文字列を文字列の配列に分割します。firstある条件に一致する最初のアイテムを見つけます。ここで、ディレクトリと検索対象の名前の連結が実行可能であること ( -x)。次に、それを実行します。

それが役に立てば幸い!

于 2008-09-29T00:20:14.227 に答える
0

execvp の man ページから:

   The  functions  execlp() and execvp() will duplicate the actions of the
   shell in searching for an executable file  if  the  specified  filename
   does  not  contain  a slash (/) character.  The search path is the path
   specified in the environment by the PATH variable.   If  this  variable
   isn’t specified, the default path ‘‘:/bin:/usr/bin’’ is used.  In addi-
   tion, certain errors are treated specially.

execlp() の使用が許可されているのではないでしょうか? execv を使用する必要がある場合は、PATH 環境変数の値を取得し、strtok() を使用してこれを解析して個々のパスを取得し、各パスにファイル名を追加して、execv() で実行を試みる必要があります。

私はコードを提供しますが、あなたのために宿題をしているわけではありません。

于 2008-09-29T00:26:15.010 に答える
0

ああ、学校のプロジェクト…

「どのような」何かが必要な場合は、「どの」自体(Linuxでは/usr/bin/whichであり、bashエイリアスまたはtcsh組み込みではありません)を実行して、探しているものへのパスを取得してください...

:-)

于 2008-09-29T17:13:52.480 に答える