How to wait untill all child processes called by fork() complete?


How to wait untill all child processes called by fork() complete?



I am forking a number of processes and I want to measure how long it takes to complete the whole task, that is when all processes forked are completed. Please advise how to make the parent process wait until all child processes are terminated? I want to make sure that I stop the timer at the right moment.

Here is as a code I use:

#include <iostream> #include <string> #include <fstream> #include <sys/time.h> #include <sys/wait.h>  using namespace std;  struct timeval first,  second,  lapsed; struct timezone tzp;   int main(int argc, char* argv[])// query, file, num. of processes. {  int pCount = 5; // process count  gettimeofday (&first, &tzp); //start time  pid_t* pID = new pid_t[pCount];  for(int indexOfProcess=0; indexOfProcess<pCount; indexOfProcess++)  { pID[indexOfProcess]= fork();  if (pID[indexOfProcess] == 0)                // child {     // code only executed by child process  //magic here  exit(0);// The End } else if (pID[indexOfProcess] < 0)            // failed to fork {     cerr << "Failed to fork" << endl;     exit(1); } else                         // parent { // if(indexOfProcess==pCount-1) and a loop with waitpid??  gettimeofday (&second, &tzp); //stop time if (first.tv_usec > second.tv_usec) {  second.tv_usec += 1000000;  second.tv_sec--; }  lapsed.tv_usec = second.tv_usec - first.tv_usec; lapsed.tv_sec = second.tv_sec - first.tv_sec;   cout << "Job performed in " <<lapsed.tv_sec << " sec and " << lapsed.tv_usec    << " usec"<< endl << endl;   }  }//for  }//main 



Preventing delayed_job background jobs from consuming too much CPU on a single server

1:



Interprocess Communication in C++
I'd move everything after the line "else //parent" down, outside the for loop.


What are the pros & cons of pre-compiled headers specifically in a GNU/Linux environment/tool-chain?
After the loop of forks, do another for loop with waitpid, then stop the clock and do the rest:.
select() call not returning when chars on port
for (int i = 0; i < pidCount; ++i) {     int status;     while (-1 == waitpid(pids[i], &status, 0));     if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {         cerr << "Process " << i << " (pid " << pids[i] << ") failed" << endl;         exit(1);     } }  gettimeofday (&second, &tzp); //stop time 
I've assumed that if the child process fails to exit normally with a status of 0, then it didn't complete its work, and therefore the test has failed to produce valid timing data.


Possible to build a shared library with static link used library?
Obviously if the child processes are supposed to be killed by signals, or exit non-0 return statuses, then you'll have to change the error check accordingly..
Retrieving info of a very large directory
An alternative using wait:.
MP3 and OGG tags in PHP
while (true) {     int status;     pid_t done = wait(&status);     if (done == -1) {         if (errno == ECHILD) break; // no more child processes     } else {         if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {             cerr << "pid " << done << " failed" << endl;             exit(1);         }     } } 
This one doesn't tell you which process in sequence failed, but if you care then you can add code to look it up in the pids array and get back the index..
Running an applet in Linux?


2:


The simplest method is to do.
while(wait() > 0) { /* no-op */ ; } 
This will not work if wait() fails for some reason other than the fact that there are no children left.

So with som error checking, this becomes.
int status; [...] do {     status = wait();     if(status == -1 && errno != ECHILD) {         perror("Error during wait()");         abort();     } } while (status > 0); 
See also the manual page wait(2)..


3:


Call wait (or waitpid) in a loop until all children are accounted for.. In this case, all processes are synchronizing anyway, but in general wait is preferred when more work can be done (eg worker process pool), since it will return when the first available process state changes..


4:


I believe the wait system call will accomplish what you are looking for..


5:


for(int i = 0; i<pidCount; i++     while(0<waitpid(pids[i],NULL,0)); // won't wait in right order but stops soon after last child dies 



85 out of 100 based on 85 user ratings 535 reviews