#include #include // fork #include // wait #include // wait #include // perror #include // exit #include #include const int PROCS = 5; using namespace std; void ReportStatus(int pid, int status) { cout << "\tStatus Report for pid " << pid << endl; cout << "\t\t" << pid << " used exit(" << WEXITSTATUS(status) << ")" << endl; return; } void ReportChildren(vector children){ int i=0; cout << "Still to Exit: "; if (children.size() > 0) { for(i = 0; i < children.size()-1; i++) { cout << children[i] << ", "; } if (i < children.size()) { cout << children[i] << endl; } } else { cout << "none " << endl; } return; } int main() { vector children; vector::iterator j; pid_t tmp, pid; int status; int i; int sleepTime; i = 0; while (i < PROCS) { tmp = fork(); if (tmp == -1) { perror("Fork"); exit(-1); }else if (tmp != 0) { // parent. children.push_back(tmp); i++; } else { i = PROCS; } } if (tmp == 0) { // all processes are here right now, // need to srand with something different srand(getpid()); sleepTime = rand() % 10; cout <<"\t" << getpid() << " going to sleep for " << sleepTime << endl; sleep(sleepTime); cout <<"\t" << getpid() << " Is back." << endl; status = rand() % 5; cout <<"\t" << getpid() << " is exiting with status " << status << endl; cout << endl; exit(status); } while(children.size() > 0) { ReportChildren(children); pid = wait(&status); cout <<"\t" << "Process " << pid << " just exited with status " << status << endl; ReportStatus(pid, status); j = find(children.begin(), children.end(),pid); children.erase(j); } ReportChildren(children); return 0; }