0

所以我试图在一个单独的子进程中执行 wget,我用 fork 复制如下:

  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

您可以在此代码中指出任何明显的错误吗?如果重要的话,这是我在 main 中调用的 void 函数内部发生的事情是它没有下载并且它显示“DL Finished”,但不执行wget -然后终端接管。

这是在 Ubuntu 12.04.2 LTS 上执行的。我以前在同一个 void 函数中使用child执行正常工作的“ls”,即我告诉它 ls 的整个路径(/bin/ls)。我读到不提供完整路径会使其搜索命令,这就是我想要的。

4

2 回答 2

2

我读到不提供完整路径会使其搜索命令

这发生在execlp. 此外,按照惯例,第一个参数应该是可执行文件的名称。所以你可以尝试:

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

作为旁注,你while (!done)错了。这不是您等待程序完成的方式。事实上,一旦你调用它就消失了:另一个进程“替换”你自己的进程execwhile所以你可以认为它“exec是一个不返回的函数”。标准的方法是wait(2)在父母中直到孩子死去。


作为第二个旁注,如果您想要的只是wget某事并等到wget完成,system(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 回答