int main() { srand(time(0)); //let user specify parameters printf("Specify the probability of a truck arriving, as a percentage: "); scanf("%d", &probabiltyOfTruckArriving); printf("Specify the max time interval between two vehicle arrivals, in milliseconds: "); scanf("%d", &maxTimeBetweenArrivals); initialize(); //create the vehicle int pid = fork(); if(pid == 0) { //child, its vehicle vehicle(); return 0; } vehicleProcessId = pid; captain(); terminate(); return 0; }
int main(){ // Initializations. msg_t buffer; int len = sizeof(msg_t) - sizeof(long); int truck_prob = 50; int spawn_interval = 300; int ferry_travel = 500; printf("Enter a probability within [0..100] that a truck arrives in place of a car: "); scanf("%d", &truck_prob); printf("\nEnter the maximum time interval in milleseconds between vehicle arrivals: "); scanf("%d", &spawn_interval); printf("\nEnter the Ferry travel time in milleseconds : "); scanf("%d", &ferry_travel); key_t key_arrivals; key_arrivals = ftok(".","arr"); int q_arrivals = msgget(key_arrivals, IPC_CREAT | 0660); printf("Arrival queue : %d\n", q_arrivals); key_t key_early; key_early = ftok(".","ear"); int q_early = msgget(key_early, IPC_CREAT | 0660); printf("Early queue : %d\n", q_early); key_t key_late; key_late = ftok(".","lat"); int q_late = msgget(key_late, IPC_CREAT | 0660); printf("Late queue : %d\n", q_late); key_t key_ferry; key_ferry = ftok(".","fer"); int q_ferry = msgget(key_ferry, IPC_CREAT | 0660); printf("Ferry deck : %d\n", q_ferry); key_t key_boarded; key_boarded = ftok(".","boa"); int q_boarded = msgget(key_boarded, IPC_CREAT | 0660); printf("Boarded vehicles: %d\n", q_boarded); pid_t capt; // Spawn captain process to manage the ferry. if( (capt = fork()) == 0 ) captain( ferry_travel+1, q_arrivals, q_early, q_late, q_ferry, q_boarded, len ); // End Initializations. // Keep track of children that captain did not terminate. int n = 1000; pid_t* childArray = malloc(n*sizeof(pid_t)); pid_t child; int child_counter = 0; // Start vehicle spawning until ferry loads are done. int timeGap; while( !waitpid(capt, NULL, WNOHANG) ){ timeGap = (rand()%spawn_interval) + 1; usleep(timeGap*1000); if( (child = fork()) == 0 ){ vehicle(truck_prob, q_arrivals, q_boarded, len); }else{ childArray[child_counter] = child; }; child_counter++; if( child_counter == n ){ n = n*2; childArray = realloc(childArray, n*sizeof(pid_t)); }; }; // Remove all child processes. int v = 0; for( v; v < child_counter; v++ ){ kill(childArray[v], SIGTERM); }; free(childArray); // Remove all queues. msgctl(q_arrivals, IPC_RMID, 0); msgctl(q_late, IPC_RMID, 0); msgctl(q_early, IPC_RMID, 0); msgctl(q_ferry, IPC_RMID, 0); msgctl(q_boarded, IPC_RMID, 0); return 0; }