Cod sursa(job #2278101)

Utilizator eu3neuomManghiuc Teodor-Florin eu3neuom Data 7 noiembrie 2018 11:45:00
Problema A+B Scor 0
Compilator c-64 Status done
Runda Arhiva de probleme Marime 2.16 kb
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h> 
#include <sys/stat.h>
#include <errno.h>

int main(int argc, char *argv[]) {
	char shm_name[] = "myshm";
	int shm_fd = shm_open(shm_name, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
	if (shm_fd < 0) {
		perror(NULL);
		return errno;
	} 
	const size_t PER_CHILD = getpagesize();
	size_t shm_size = argc * PER_CHILD;
	if (ftruncate(shm_fd, shm_size) == -1) {
		perror(NULL);
		shm_unlink(shm_name);
		return errno;
	}
	
    int n = argc;
    int i;
	int offset;
    pid_t pid;
	printf("Starting parent PID={%d}\n", getpid());
    for (i = 1, offset = 0; i < n; i++, offset += PER_CHILD) {
		// printf("offset = %d\n", offset);

        pid = fork();
        if (pid > 0) {

        } else if (pid == 0) {
			int *shm_ptr = mmap(0, PER_CHILD, PROT_WRITE, MAP_SHARED, shm_fd, offset);

			if (shm_ptr == MAP_FAILED) {
				perror(NULL);
				shm_unlink(shm_name);
				return errno;
			}

			int j;
			int x = atoi(argv[i]);
			shm_ptr[0] = x;
			for (j = 1; x != 1; ++j) {
				if (x % 2 == 0) {
					x /= 2;
				} else {
					x = 3 * x + 1;
				}
				shm_ptr[j] = x;
            }
			shm_ptr[j] = 1;
			printf("DONE! My PID={%d}, Parent PID={%d}\n", getpid(), getppid());

			if (munmap(shm_ptr, PER_CHILD) == -1) {
				perror(NULL);
				shm_unlink(shm_name);
				return errno;
			}
            exit(0);
        } else if (pid < 0) {
            printf("parent says: fork() failed\n");
        }
    }
	
	for (i = 1; i <= n; ++i) {
		wait(NULL);	
	}
	
	for (i = 1, offset = 0; i < n; ++i, offset += PER_CHILD) {
		int *shm_ptr = mmap(0, PER_CHILD, PROT_READ, MAP_SHARED, shm_fd, offset);
		if (shm_ptr == MAP_FAILED) {
			perror(NULL);
			shm_unlink(shm_name);
			return errno;
		}

		int j = 0;

		printf("%d: ", atoi(argv[i]));
		while (shm_ptr[j] != 1) {
			printf("%d ", shm_ptr[j]);	
			++j;
		}
		printf("1\n");

		if (munmap(shm_ptr, PER_CHILD) == -1) {
			perror(NULL);
			shm_unlink(shm_name);
			return errno;
		}
	}

	shm_unlink(shm_name);
	printf("DONE! My PID={%d}, Parent PID={%d}\n", getpid(), getppid());
	return 0;
}