F fnolis Medlem sedan sep. 2001 62 inlägg Frågan 16 okt. 2002 12:34 #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?
Z zmodem Medlem sedan apr. 2002 77 inlägg är det jag som är kass eller vadå vänta på _alla_ childs? vadå fork()
fatta inte...
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().
Z zmodem Medlem sedan apr. 2002 77 inlägg 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?
F fnolis Medlem sedan sep. 2001 62 inlägg 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;
}