C++ 分叉子进程

C++ 分叉子进程,c++,linux,fork,C++,Linux,Fork,在一个简单的下载程序上工作,它将下载一个数组中的文件项 当前,它将下载阵列中的第一个项目,但是当for循环转到下载下一个项目时,它似乎停留在已下载的项目上 这意味着它不会增加到下一个项目,但它确实运行了它应该运行的次数 i、 e.2要下载的项目,它将下载阵列中的第一个项目两次 我相信我的分叉过程做错了,或者计数器在for循环中被重置 // Begin the downloading process pid_t child = 0; child = fork(); wait(); if ( chi

在一个简单的下载程序上工作,它将下载一个数组中的文件项

当前,它将下载阵列中的第一个项目,但是当for循环转到下载下一个项目时,它似乎停留在已下载的项目上

这意味着它不会增加到下一个项目,但它确实运行了它应该运行的次数

i、 e.2要下载的项目,它将下载阵列中的第一个项目两次

我相信我的分叉过程做错了,或者计数器在for循环中被重置

// Begin the downloading process
pid_t child = 0;
child = fork();
wait();
if ( child < 0)
{
    cout << "Process Failed to Fork" <<endl;
    return 1;
}
if (child == 0)
    {
        wait();
    }
else
{

    for(int i = 0; i < numberOfDownloads; i++)
    {
    child = fork();
    wait();
    execl("/usr/bin/wget", "wget",locations[i], NULL);  
    }
}
//开始下载过程
pid_t child=0;
child=fork();
等待();
if(子级<0)
{

cout问题在于,您的
for
循环fork,而不考虑子对象与父对象,并且子对象和父对象都以i==0执行
execl()
。您需要根据
fork()
的返回来包装您的操作,方法与之前在代码段中所做的相同

else
{
    for(int i = 0; i < numberOfDownloads; i++)
    {
        child = fork();
        if (child > 0) execl("/usr/bin/wget", "wget",locations[i], NULL);  
    }

    /* call wait() for each of your children here, if you wish to wait */
}
else
{
for(int i=0;i0)execl(“/usr/bin/wget”,“wget”,位置[i],空);
}
/*如果您希望等待,请在此处为您的每个孩子调用wait()*/
}

您的程序并不是一个真正的下载程序,它只是
wget
的包装器。您应该研究使用libcurl(用于HTTP客户端处理的库)。您可以在c++11中使用std::async