Exemplo n.º 1
0
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;
}
Exemplo n.º 2
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;
}