Created
May 24, 2013 19:59
-
-
Save MosheBerman/5646116 to your computer and use it in GitHub Desktop.
Why is my second loop logging in order?
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
int | |
main(int argc, char* argv[]) | |
{ | |
// Wire up the timer | |
long time = elapsedTime(0); | |
/* Generate a random number between MINFORKS and MAXFORKS | |
*/ | |
unsigned int seed = generateSeed(0); | |
int n = rand_r(&seed) % MAXFORKS + MINFORKS-1; | |
/* Log next step | |
*/ | |
time = elapsedTime(1); | |
printf("%li: Number of forks = %i\n", time, n); | |
/* Hang on to the PIDs so we can wait for them after forking | |
*/ | |
pid_t *PIDs = (pid_t *)(malloc(sizeof(*PIDs)*n)); | |
/* Fork n times | |
*/ | |
for (int i = 0; i < n ; i++) | |
{ | |
/* Call fork() and retain the returned identifier | |
*/ | |
pid_t processIdentifier = fork(); | |
/* Randomize the child sleep time | |
*/ | |
seed = generateSeed(0); | |
int sleeptime = rand_r(&seed) % MAXPAUSE + MINPAUSE; | |
/* Check for errors | |
*/ | |
if (processIdentifier == -1) { | |
printf("Error: %i", errno); | |
} | |
if (!processIdentifier) | |
{ | |
/* We're in the child process, | |
* sleep and then exit with | |
* i as the error code. | |
*/ | |
usleep(sleeptime); | |
_exit(i); | |
} | |
else | |
{ | |
/* We're in the parent: | |
* Store the PID and | |
* print out the results. | |
*/ | |
PIDs[i] = processIdentifier; | |
time = elapsedTime(1); | |
printf("%li: Child %i, pid = %i, forked, waits %i usec\n", time, i, processIdentifier, sleeptime); | |
} | |
} | |
/* Log next step | |
*/ | |
time = elapsedTime(1); | |
printf("%li: Finished forking, going to wait.\n", time); | |
/* | |
* Loop through the processes and wait for them | |
* to terminate. Then print the childid, and the | |
* the pid. | |
*/ | |
for (int i = 0; i < n; i++) | |
{ | |
/* Get the PID we want to track | |
*/ | |
pid_t pid = PIDs[i]; | |
/* Wait for the child process | |
* and grab it's status info | |
*/ | |
int status = NULL; | |
int childid; | |
waitpid(pid, &status, 0); | |
if(WIFEXITED(status)) | |
{ | |
childid = WTERMSIG(status); | |
} | |
/* Log the results | |
*/ | |
time = elapsedTime(1); | |
printf("%li: Child %i, pid = %i, terminated\n", time, childid, pid); | |
} | |
/* All done! | |
*/ | |
time = elapsedTime(1); | |
printf("All done. It only took %li milliseconds!", time); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment