3

excve次のコードは、何らかの理由で現在のディレクトリの内容を出力しないコマンドを呼び出す必要がありますが、それでもプログラムは戻ります"ok"

  1 #include <stdio.h>
  2 #include <unistd.h>
  3 int main ()
  4 { char *argv[]={"ls",NULL};·
  5   char *env[]={"PATH=/usr/local/sbin/:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games",NULL};
  6   if(execve("ls",argv,env))
  7   { printf("ok\n");
  8   }
  9   else
 10   { printf("not ok\n");
 11   }
 12   return 0;
 13 }      
4

4 に答える 4

2

これはあまり意味がありません

if(execve("ls",argv,env) >0) {
    printf("ok\n");
} else {
    printf("not ok\n");
}

すべての関数execは成功した場合に返されるわけではないため、返された場合は失敗したことを意味し、返されたかどうかを確認する必要はありません。-1execve()

execve() はfilenameが指すプログラムを実行します。

したがって、次のことを行う必要があります。

execve("/bin/ls", argv, env);
/* execve() only returns on error */
perror("execve");   
exit(EXIT_FAILURE);
于 2012-11-21T14:03:51.543 に答える
2

exec の呼び出しは、成功しても返されません。基本的に、呼び出し元のプログラムを実行中のプログラムに置き換えます。

したがって、exec を超えてコードを実行した場合は、exec が失敗したことを意味します。exec は -1 を返すと思います。これが、正常に印刷される理由です。

于 2012-11-21T13:58:48.203 に答える
1

execve はエラー時に -1 を返します。これは、ブール値を必要とするコンテキストで使用された場合に true と評価されます。ただし、execve が成功した場合は返されないため、戻り値をチェックしても意味がありません。

おそらくこの場合、「ls」へのフルパスを指定していないために失敗しています。

于 2012-11-21T13:56:40.227 に答える