Example #1
0
int main(int argc, char *argv[]) {
	pthread_t recv;
	int res;

	char str_buf[4096];                               // temporary string buffer

	srand(time(NULL));                                 // initialize random seed
	char rnd_char = 97 + (int) (26.0 * rand() / (RAND_MAX + 1.0)); // generate random char (ASCII: a..z)

	// Allocate access protected page memory
	if (posix_memalign((void**) &page_mem, page_size, (page_num * page_size))
			!= 0) {
		fprintf(0, "Error allocating page memory\n");
		return 1;
	}
	mprotect(page_mem, (page_num * page_size), PROT_NONE);

	// Create socket as recv thread)
	fd = setup_socket(CLIENT);
	res = pthread_create(&recv, NULL, client_recv, (void *) (size_t) fd);
	if (res != 0) {
		perror("pthread_create() failed");
		close(fd);
	}
	if (register_segfault_handler(page_mem) != 0) {
		printf("Cannot register SEGV handler\n");
		return -1;
	}

	// Random client operations
	while (1) {

		client_operations_t operation = (3.0 * rand() / (RAND_MAX + 1.0)); // select random operation (READ, WRITE, SYNC)
		int delay = 100 + (int) (200.0 * rand() / (RAND_MAX + 1.0)); // random delay regarding endless loop (100..300ms)
		size_t page_offset = 0;                 // initialize random page offset


		//page_offset = ((3.0 * rand() / (RAND_MAX + 1.0)) * page_size); // select random shared memory page (used in 'client_a2c' executable only)

		void *addr = page_mem + page_offset;
		printf("addr = %p, delay = %d, operation = %x \n",addr, delay,operation);
		switch (operation) {
		case READ:                      // Read string from first/random memory page
			strncpy(str_buf, addr, STR_LEN);
			printf("[Own char: '%c']: Page content (addr: %p) '%s'\n", rnd_char,
					addr, str_buf);
			break;
		case WRITE:        // Fill first/random memory page with own random char
			memset(addr, rnd_char, page_size);
			break;
		case SYNC: // Send all modified pages back to server (server releases write locks)
			printf("sync\n");
			sync();
			break;
		}
		usleep(delay * 10000); //sleep of 'delay' ms

	}

	return 0;
}
int main(int argc, char **argv){
    register_segfault_handler();
    command_loop();

    return 0;
}