所以我试图在一个单独的子进程中执行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)。我读到没有提供完整路径会使它搜索命令,这就是我想要的。
答案 0 :(得分:2)
我读到没有提供完整路径会让它搜索到 命令
execlp
会发生这种情况。此外,按照惯例,第一个参数应该是可执行文件的名称。所以你可以试试:
execlp("wget", "wget", "someurl", NULL);
^ ^^^^^
作为旁注,您的while (!done)
是错误的。这不是你等待程序完成的方式。事实上,一旦你致电exec
,while
就消失了:另一个过程“替换”了你自己。所以你可以想到它“exec
是一个不返回的函数”。标准方法是父母wait(2)
,直到孩子死亡。
作为第二方注释,如果你想要的只是wget
并等到wget
完成,那么system(3)
可能更合适:
system("wget someurl");
答案 1 :(得分:1)
传递给execl
的参数是新进程argv
函数的main
数组。如您所知,argv
中的第一个条目是程序名称本身。
所以你需要做的是:
execlp("wget", "wget", "someurl", NULL);
此外,如果一切顺利,exec
系列函数不会返回,那么exec
调用后的任何代码都不会运行。