0

したがって、次のように fork で複製している別の子プロセスで wget を実行しようとしています。

  int child;
  pid_t child = fork();
if ( child == 0 ) { // no errors
  bool done = false;  // set to false
  while (!done) { // while not true do
  execl("wget", "someurl", NULL);
  done = true;  // since dl finished
 }
 cout << "DL Finished\n";  // to see if child was successful
}
else if ( child != 0 ) { // errors

このコードで指摘できる明らかなエラーはありますか? 問題がある場合、これは私がメインで呼び出している void 関数内にあります。何が起こっているのかというと、ダウンロード中ではなく、「DL Finished」と表示されますが、wget は実行されません。その後、ターミナルが引き継ぎます。

これは Ubuntu 12.04.2 LTS で実行されます。以前、同じ void 関数内でを使用して「ls」を実行しましたが、これは適切に動作します。つまり、ls のパス全体 (/bin/ls) を伝えています。フルパスを指定しないと、コマンドが検索されることを読みました。これが私が望んでいることです。

4

2 に答える 2

2

フルパスを指定しないとコマンドが検索されることを読みました

それは で起こりexeclpます。また、慣例により、最初の引数は実行可能ファイルの名前にする必要があります。だからあなたは試すことができます:

execlp("wget", "wget", "someurl", NULL);
     ^          ^^^^^

補足として、あなたwhile (!done)は間違っています。それは、プログラムが終了するのを待つ方法ではありません。実際、一度呼び出すとexecwhile別のプロセスが自分のプロセスを「置き換え」ます。execですから、「返さない関数」と考えることができます。標準的な方法はwait(2)、子供が死ぬまで親にいることです。


2番目の補足として、何かをしたいだけで、それが完了wgetするまで待つ場合は、おそらくより適切です:wgetsystem(3)

system("wget someurl");
于 2013-04-07T10:44:15.787 に答える
1

渡す引数は、新しいプロセス関数の配列になりexeclます。ご存知のように、最初のエントリはプログラム名そのものです。argvmainargv

だからあなたがする必要があるのは:

execlp("wget", "wget", "someurl", NULL);

また、すべてがうまくいった場合exec、関数のファミリは返されないため、exec呼び出しの後のコードは実行されません。

于 2013-04-07T10:44:36.073 に答える