Cod sursa(job #2489172)

Utilizator lucianistratiIstrati Lucian lucianistrati Data 7 noiembrie 2019 23:13:09
Problema Aria Scor 0
Compilator cpp-32 Status done
Runda Arhiva educationala Marime 2.01 kb
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <string.h>

int a2i(const char *s)
{
    int n = 0;
    while (*s)
    {
        n = ( (*s) - '0') + n * 10;
        s++;    
    }

    return  n;
    
}

int main(int argc, char const *argv[])
{
	pid_t pid;

	char shm_name[] = "myshm";
	int shm_fd;
	size_t shm_size = 1000 * getpagesize();

	// create shared memory object
	shm_fd = shm_open(shm_name, O_CREAT|O_RDWR, S_IRUSR|S_IWUSR);
	if (shm_fd < 0) {
		perror(NULL);
		return errno;
	}

	// define size of shared memory object
	if (ftruncate(shm_fd, shm_size) == -1) {
		perror(NULL);
		shm_unlink(shm_name);
	}


	for (int i = 1; i < argc; i++) {

		int nr = a2i(argv[i]);

		// create process
		pid = fork();

		if (pid < 0) {
			return errno;
		} 
		else if (pid == 0) {
			char buff[getpagesize()];
			void* shmptr = mmap(0, getpagesize(), PROT_WRITE, MAP_SHARED, shm_fd, (i - 1) * getpagesize());

			if (shmptr == MAP_FAILED) {
				perror(NULL);
				shm_unlink(shm_name);
				return errno;
			}
			while(nr != 1) {

				char nr_char[10];
				sprintf(nr_char, "%d " , nr);
				strcat(buff, nr_char);

				if (nr % 2 == 0) {
					nr = nr / 2;
				} else {
					nr = 3 * nr + 1;
				}
			}

			strcat(buff, "1\n");
			sprintf(shmptr, "%s", buff);
			munmap(shmptr, getpagesize());

			printf("Done Parent %d Me %d \n", getppid(), getpid());
			exit(0);
		} 
	}

	for (int i = 1; i  < argc; i++) {
		wait(NULL);
	}

	for (int i = 1; i < argc; i++) {

		char* shmptr = mmap(0, getpagesize(), PROT_READ, MAP_SHARED, shm_fd, (i - 1) * getpagesize());

		if (shmptr == MAP_FAILED) {
			perror(NULL);
			shm_unlink(shm_name);
			return errno;
		}
		printf("%s", shmptr);

		munmap(shmptr, getpagesize());
	}

	shm_unlink(shm_name);

	printf("Done Parent %d Me %d\n", getppid(), getpid());
	return 0; 
}