1*9180c14fSKAWASHIMA Takahiro #include <stdatomic.h> 2*9180c14fSKAWASHIMA Takahiro #include <stdlib.h> 3*9180c14fSKAWASHIMA Takahiro #include <sys/mman.h> 4*9180c14fSKAWASHIMA Takahiro #include <sys/types.h> 5*9180c14fSKAWASHIMA Takahiro #include <sys/wait.h> 6*9180c14fSKAWASHIMA Takahiro #include <unistd.h> 7*9180c14fSKAWASHIMA Takahiro 8*9180c14fSKAWASHIMA Takahiro #define CHILDREN 7 9*9180c14fSKAWASHIMA Takahiro main(int argc,char * argv[])10*9180c14fSKAWASHIMA Takahiroint main(int argc, char *argv[]) { 11*9180c14fSKAWASHIMA Takahiro _Atomic int *sync = mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE, 12*9180c14fSKAWASHIMA Takahiro MAP_SHARED | MAP_ANONYMOUS, -1, 0); 13*9180c14fSKAWASHIMA Takahiro if (sync == MAP_FAILED) 14*9180c14fSKAWASHIMA Takahiro return 1; 15*9180c14fSKAWASHIMA Takahiro *sync = 0; 16*9180c14fSKAWASHIMA Takahiro 17*9180c14fSKAWASHIMA Takahiro for (int i = 0; i < CHILDREN; i++) { 18*9180c14fSKAWASHIMA Takahiro pid_t pid = fork(); 19*9180c14fSKAWASHIMA Takahiro if (!pid) { 20*9180c14fSKAWASHIMA Takahiro // child 21*9180c14fSKAWASHIMA Takahiro while (*sync == 0) 22*9180c14fSKAWASHIMA Takahiro ; // wait the parent in order to call execl simultaneously 23*9180c14fSKAWASHIMA Takahiro execl(argv[1], argv[1], NULL); 24*9180c14fSKAWASHIMA Takahiro } else if (pid == -1) { 25*9180c14fSKAWASHIMA Takahiro *sync = 1; // release all children 26*9180c14fSKAWASHIMA Takahiro return 1; 27*9180c14fSKAWASHIMA Takahiro } 28*9180c14fSKAWASHIMA Takahiro } 29*9180c14fSKAWASHIMA Takahiro 30*9180c14fSKAWASHIMA Takahiro // parent 31*9180c14fSKAWASHIMA Takahiro *sync = 1; // start the program in all children simultaneously 32*9180c14fSKAWASHIMA Takahiro for (int i = 0; i < CHILDREN; i++) 33*9180c14fSKAWASHIMA Takahiro wait(NULL); 34*9180c14fSKAWASHIMA Takahiro 35*9180c14fSKAWASHIMA Takahiro return 0; 36*9180c14fSKAWASHIMA Takahiro } 37