1

次のように、Cからexeclコマンドによって生成されたプロセスに2つのアドレス(32ビット)を渡す必要があります。最初のプログラムでは:

  char buffer[18];
  sprintf (&buffer[0],"%x\0 %x\0",lock, count);
  arg_list[0]=&(buffer[0]);
  arg_list[1]=&(buffer[10]);
  execl ("/somedirectory/second_process", arg_list[0], arg_list[1], NULL);

次に、2番目のプログラムで、次のようにアドレスを解析しようとします。

  if (argc != 2) {
      printf ("PROCESS 2: Invalid number of arguments. Terminating %i\n", argc);
      return -1;
  }

 if ( !(sscanf (argv[1],"%x",&lock)) || !(sscanf (argv[2],"%x",&count)) ) {
      printf ("PROCESS 2: Problem with parameters passed in");
      return -1;

しかし、私のプログラムは、渡されたパラメータが無効であるというエラーを出し続けます。受信した引数を出力しようとすると、プログラムがハングします。

 printf ("The arguments passsed in are %s %s", argv[1], argv[2]);

修繕:

execl呼び出しを間違って行っていました。それはすべきだった:

  execl ("/somedirectory/second_process", "second_process" arg_list[0], arg_list[1], NULL);

また、プロセス2:

  if (argc != 3) {
      printf ("PROCESS 2: Invalid number of arguments. Terminating %i\n", argc);
      return -1;
  }

渡される最初の引数は、以下のChrisが提案するように、プロセス名の引数であると想定されています。

ありがとう!

4

2 に答える 2

5

配列は常にCベースで0であるため、2つの引数はとにargv[0]なりargv[1]argv[2]nullポインターになるため、sscanfは失敗、クラッシュ、またはハングします。

これで、通常、プログラム名を常に最初の(argv[0])引数として渡す必要があります。あなたが望んでいるのは:

execl ("/somedirectory/second_process", "second_process", arg_list[0], arg_list[1], NULL);

つまり、実際には3つの引数を渡す必要があります(argc == 32番目のプログラムでも同様です)。

于 2012-09-21T20:29:20.223 に答える
1

あなたの場合argcは3つになります。実行ファイルの名前は常に最初の引数です。

于 2012-09-21T20:25:49.507 に答える