fork download
  1. #include <iostream>
  2. #include <sys/types.h>
  3. #include <unistd.h>
  4. #include <signal.h>
  5. #include <time.h>
  6. #include <fstream>
  7. #include <sys/ipc.h>
  8. #include <sys/shm.h>
  9. #include <sys/stat.h>
  10. #include <sys/wait.h>
  11. #include <cstdlib>
  12.  
  13. using namespace std; // consider removing this line in serious projects
  14.  
  15. int totalProcessesToBeForked = 10;
  16. int processesCurrentlyForked = 0;
  17. int maxAllowedAtOnce = 5;
  18. int timeBeforeTerminate = 10;
  19. bool endTimer = false;
  20. pid_t masterPId;
  21. pid_t childPId;
  22.  
  23. void forkChild(int);
  24. void catchChild(int);
  25. void onTimeout(int);
  26. void cleanup();
  27.  
  28. int main() {
  29. // Start timer
  30. alarm(timeBeforeTerminate); // Terminate after 10s
  31. signal(SIGALRM, onTimeout);
  32. signal(SIGCHLD, catchChild);
  33.  
  34. masterPId = getpid();
  35.  
  36. // Allocate & attach shared memory
  37.  
  38. int currentChild = 0;
  39. while(currentChild < totalProcessesToBeForked) {
  40. if(processesCurrentlyForked < maxAllowedAtOnce) {
  41. forkChild(currentChild);
  42. currentChild++;
  43. processesCurrentlyForked++;
  44. }
  45. sleep(1);
  46. }
  47.  
  48. // Completed before timeout
  49. endTimer = true;
  50. int timeRemaining = alarm(0);
  51. if (timeRemaining > 0) {
  52. printf("\nCompleted w/ %is remaining. Performing cleanup.\n", timeRemaining);
  53. cleanup();
  54. }
  55.  
  56. return 0;
  57. }
  58.  
  59. void forkChild(int currentChild) {
  60. pid_t pid = fork();
  61.  
  62. if (pid < 0) {
  63. // Error
  64. } else if (pid == 0) {
  65. // Child
  66. printf("#Log: #Inside %i.\n", currentChild + 1);
  67. execl("/bin/date", "date", 0, 0);
  68. } else {
  69. // Parent
  70. printf("#Log: Started %i.\n", currentChild + 1);
  71. }
  72. }
  73.  
  74. void catchChild(int sig) {
  75. pid_t p;
  76. int state;
  77. p=wait(&state);
  78. printf("Got child %d\n",p);
  79. processesCurrentlyForked--;
  80. }
  81.  
  82. void cleanup() {
  83. // Kill children
  84. signal(SIGINT, SIG_IGN);
  85. kill(-masterPId, SIGINT);
  86. sleep(2);
  87.  
  88. // Detach & release shared memory
  89. }
  90.  
  91. void onTimeout(int signal) {
  92. if (!endTimer && alarm(timeBeforeTerminate) == 0) {
  93. printf("\nTimeout! Killing slaves & performing clean up.\n");
  94.  
  95. kill(masterPId, SIGINT);
  96. }
  97. exit(0);
  98. }
Success #stdin #stdout 0s 15240KB
stdin
Standard input is empty
stdout
Fri Mar 31 23:33:50 UTC 2017
Fri Mar 31 23:33:50 UTC 2017
Fri Mar 31 23:33:50 UTC 2017
Fri Mar 31 23:33:50 UTC 2017
Fri Mar 31 23:33:50 UTC 2017
Fri Mar 31 23:33:50 UTC 2017
Fri Mar 31 23:33:50 UTC 2017
Fri Mar 31 23:33:50 UTC 2017
Fri Mar 31 23:33:50 UTC 2017
Fri Mar 31 23:33:50 UTC 2017
#Log: Started 1.
Got child 7071
#Log: Started 2.
Got child 7072
#Log: Started 3.
Got child 7073
#Log: Started 4.
Got child 7074
#Log: Started 5.
Got child 7075
#Log: Started 6.
Got child 7076
#Log: Started 7.
Got child 7077
#Log: Started 8.
Got child 7078
#Log: Started 9.
Got child 7079
#Log: Started 10.
Got child 7080

Completed w/ 10s remaining. Performing cleanup.