#include #include // fork #include // wait #include // wait #include // perror #include // exit #include #include #include using namespace std; const string PROMPT = "? "; void ReportStatus(int pid, int status) { cout << "\tStatus Report for pid " << pid << endl; cout << "\t\t" << pid << " used exit(" << WEXITSTATUS(status) << ")" << endl; return; } void CleanUp(int pid, int status, vector & children) { vector::iterator j; cout <<"\t" << "Process " << pid << " just exited with status " << status << endl; ReportStatus(pid, status); j = find(children.begin(), children.end(),pid); children.erase(j); 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; } void BeAChild() { int sleepTime; int status; srand(getpid()); sleepTime = rand() % 10 + 5; 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); return; } void ForkOne(vector & children) { pid_t pid = fork(); if (pid) { children.push_back(pid); } else { BeAChild(); } return; } int main() { vector children; pid_t pid; int status; string cmd; do { cout << PROMPT ; getline(cin, cmd); if (cmd == "FORK") { ForkOne(children); } else if (cmd == "STATUS") { ReportChildren(children); } pid = waitpid(-1, &status, WNOHANG); while (pid != 0 and children.size() > 0) { CleanUp(pid, status, children); pid = waitpid(-1, &status, WNOHANG); } } while (cmd != "EXIT"); return 0; }