Chapter 1, exercise 1, ping pong.
This commit is contained in:
		
							parent
							
								
									43085c9e38
								
							
						
					
					
						commit
						fed8339de9
					
				
					 1 changed files with 76 additions and 0 deletions
				
			
		
							
								
								
									
										76
									
								
								exercises/chapter1-exo1-ping.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								exercises/chapter1-exo1-ping.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,76 @@
 | 
			
		|||
#include <unistd.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <sys/wait.h>
 | 
			
		||||
#include <time.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
#define BILLION  1000000000L
 | 
			
		||||
#define MILLION  1000000L
 | 
			
		||||
#define THOUSAND 1000L
 | 
			
		||||
 | 
			
		||||
void get_time_ts(struct timespec *t0) {
 | 
			
		||||
	if (clock_gettime(CLOCK_REALTIME, t0) == -1) {
 | 
			
		||||
		perror("clock_gettime");
 | 
			
		||||
		exit(1);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
long long duration_ns(struct timespec t0, struct timespec t1) {
 | 
			
		||||
	return ((t1.tv_sec - t0.tv_sec)*BILLION) + (t1.tv_nsec - t0.tv_nsec);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void print_time_ns(long long time) {
 | 
			
		||||
	printf("%llds %lldms %lldµs %lldns\n"
 | 
			
		||||
		, time/BILLION
 | 
			
		||||
		, (time/MILLION)%THOUSAND
 | 
			
		||||
		, (time/THOUSAND)%THOUSAND
 | 
			
		||||
		, time%THOUSAND
 | 
			
		||||
	);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define BUFSIZE 1024
 | 
			
		||||
int main (int argc, char **argv) {
 | 
			
		||||
	struct timespec t0, t1;
 | 
			
		||||
	long long duration;
 | 
			
		||||
	long long max_duration = 0;
 | 
			
		||||
 | 
			
		||||
	int parent_to_child[2];
 | 
			
		||||
	int child_to_parent[2];
 | 
			
		||||
 | 
			
		||||
	if ( -1 == pipe(parent_to_child) ) return 1;
 | 
			
		||||
	if ( -1 == pipe(child_to_parent) ) return 1;
 | 
			
		||||
 | 
			
		||||
	char msg1[] = "ping";
 | 
			
		||||
	char bufchild[BUFSIZE] = {0} ;
 | 
			
		||||
	int nbytes;
 | 
			
		||||
 | 
			
		||||
	int pid = fork();
 | 
			
		||||
	switch ( pid ) {
 | 
			
		||||
		case -1: return 2;
 | 
			
		||||
		case 0: /*child*/
 | 
			
		||||
			close(child_to_parent[0]);
 | 
			
		||||
			close(parent_to_child[1]);
 | 
			
		||||
			while((nbytes = read(parent_to_child[0], bufchild, BUFSIZE)) > 0) {
 | 
			
		||||
				write(child_to_parent[1], bufchild, nbytes);
 | 
			
		||||
			}
 | 
			
		||||
			break;
 | 
			
		||||
		default: /*parent*/
 | 
			
		||||
			close(parent_to_child[0]);
 | 
			
		||||
			close(child_to_parent[1]);
 | 
			
		||||
			while (max_duration < BILLION) {
 | 
			
		||||
				get_time_ts(&t0);
 | 
			
		||||
				write(parent_to_child[1], msg1, strlen(msg1) + 1);
 | 
			
		||||
				nbytes = read(child_to_parent[0], bufchild, BUFSIZE);
 | 
			
		||||
				get_time_ts(&t1);
 | 
			
		||||
				duration = duration_ns(t0, t1);
 | 
			
		||||
				printf("read: %s\n", bufchild);
 | 
			
		||||
				print_time_ns(duration);
 | 
			
		||||
				max_duration += duration;
 | 
			
		||||
			}
 | 
			
		||||
			close(parent_to_child[0]);
 | 
			
		||||
			close(parent_to_child[1]);
 | 
			
		||||
			wait(NULL);
 | 
			
		||||
	}
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	Add table
		
		Reference in a new issue