webForumDet fria alternativet

fork() wait for all

C/C++ur C/C++

4 svar · 276 visningar · startad av fnolis

Medlem sedan sep. 200162 inlägg
Frågan#1

jag får inte rätt på det...

vad jag vill göra är:

int main( int argc, char *argv[] )
{
for( int i = atoi( argv[1] ); --i; )
{
if( fork() == 0 )
{
sleep( 1 );
return 0;
}
}

/\* och det är här som jag vill vänta på \_alla\_ childs \*/
wait();

return 0;

}

hur gör man för att kunna vänta på alla childs?

Medlem sedan apr. 200277 inlägg
#2

är det jag som är kass eller vadå vänta på _alla_ childs? vadå fork()

fatta inte...

Medlem sedan aug. 2001458 inlägg
#3

Du måste ropa på wait() lika många gånger som fork().

Eftersom fork() returnerar pid på childen som skapas och wait() returnerar värdet på pid som avslutats kan du matcha dessa genom att spara undan värdet av alla fork() och jämföra med dina wait().

Medlem sedan apr. 200277 inlägg
#4

Jehupp, denna tråden var tydligen out of my league, ska inte lägga mig... stayar out of it

handlar det om win32-programmering eller?

Medlem sedan sep. 200162 inlägg
#5

developer... thanks!
Jag fixade det nu!

#include <iostream>
#include <unistd.h>
#include <sys/wait.h>
#include <vector>

using namespace std;

int main( int argc, char* argv[] )
{
    vector<int>  childs;
    int child;

    for( int i = 5; i; --i )
    {
        if( ( child = fork() ) == 0 )
        {
            int sleeping = i + (getpid() % 4);
            cout << getpid() << " is about to sleep " << sleeping << "s" << endl;
            sleep( sleeping );
            cout << getpid() << " is leaving" << endl;
            return 0;
        }
        else
        {
            childs.push_back( child );
        }
    }

    cout << "wait" << endl;

    while( childs.size() )
    {
        if( waitpid( childs.back(), NULL, WNOHANG ) )
        {
            cout << "removing: " << childs.back() << endl;
            childs.pop_back();
        }
    }

    cout << "exit" << endl;

    return 0;
}
129 ms totalt · 3 externa anrop · v20260731065814-full.b746b907
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)