execl with wget,child process,unix - 为什么它不起作用

时间:2013-04-07 10:38:15

标签: c++ unix exec fork wget

所以我试图在一个单独的子进程中执行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

您可以在此代码中指出任何明显的错误?如果重要的话,这是一个虚函数,我主要调用的是它没有下载并显示“DL Finished”,但执行wget - 然后终端接管。

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

2 个答案:

答案 0 :(得分:2)

  

我读到没有提供完整路径会让它搜索到   命令

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

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

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


作为第二方注释,如果你想要的只是wget并等到wget完成,那么system(3)可能更合适:

system("wget someurl");

答案 1 :(得分:1)

传递给execl的参数是新进程argv函数的main数组。如您所知,argv中的第一个条目是程序名称本身。

所以你需要做的是:

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

此外,如果一切顺利,exec系列函数不会返回,那么exec调用后的任何代码都不会运行。