1

strace(1)基本的に を使用するのと同じことを行うプロジェクトに取り組んでいptrace()ます。基本的に、実行可能ファイルを引数として受け取り、実行可能ファイルによって行われたシステム コールを出力する controller.c プログラムがあります (たとえば、% controller ls -l) を使用しexecve()て実行可能ファイルを実行していますが、少し問題があります。execve は次の引数を取ります

 execve( const char *filename, char *const argv[], char *const envp[] )

このインスタンスの filename は で"ls"ありargv[]、指定されたファイル名の引数のリストです。したがって、次のようなものがあります(Cファイル内)

int main(int argc, char *argv[],char *envp[]){
  pid_t child;
  child = fork;

  if(/* CHILD */){
    ptrace(PTRACE_TRACEME,0, NULL, NULL);

    if(argc == 2) {
      execve(argv[1],NULL,envp);
    }
    else {
      execve( argv[1], /* ARGUMENT LIST */, envp);
    }

  } else /* PARENT */ {
    //PARENT CODE 
  }
}

実行可能ファイルを取得した場合、たとえばcontroller ls -lwhere argv[0] = "controller"argv[1] = "ls"およびargv[2] = "-l"の場合、「ARGUMENT LIST」で正しいパラメーターを渡すにはどうすればよいでしょうか (この場合の引数は単なる"-l"ものですが、それ以上になる可能性もあります)。

const char *基本的に、配列が実行可能ファイルの引数値を持つような型の配列を初期化するにはどうすればよいでしょうか? argv配列に余分な値があり、 ARGUMENT LIST の直前にあることを心配する必要さえありますか?

ご協力いただきありがとうございます!

4

2 に答える 2

1
execve(argv[1], argv+1, envp);
于 2012-09-17T00:13:03.957 に答える
1

単純に渡すことができargv + 1ます (プログラムの名前をスキップするため)。実行されたプログラムの名前であるargv + 1の 2 番目の要素から始まる配列へのポインタです。は と同等であり、好みのスタイルを使用できます。argvargv + 1&argv[1]

コメントで述べたように、標準のセクション 5.1.2.2.1 では、argv実際に null で終了することが指定されています。以下のセクションは、完全を期すために保持されています。

Cがnullで終了することを保証しない場合argv(そして、それが終了するかどうかは私には明らかではありません)、次のことができます:

char **new_argv = malloc((argc-1) * sizeof(char*));
for (int i = 0; i < argc - 1) new_argv[i] = argv[i+1];

new_argv引数リストに使用します。

于 2012-09-16T23:19:00.710 に答える