Cod sursa(job #2072627)

Utilizator Consti.001FMI Dranca Constantin Consti.001 Data 21 noiembrie 2017 23:38:28
Problema A+B Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <sys/types.h>
#include<stdio.h>
#include<unistd.h>
#include<sys/wait.h>
#include<stdlib.h>
#include<errno.h>
#include<sys/mman.h>
#include<fcntl.h>
#include<sys/stat.h>

int main()
{
	printf("Cate numere doriti sa introduceti: ");
	int n;
	scanf("%d",&n);
	
	int *v=(int*)malloc(n*sizeof(int));
	printf("Introduceti numerele: ");
	int i=0;
	for(i=0;i<n;i++)
	scanf("%d",&v[i]);
	printf("Starting parent %d\n",getpid());

	int mem;
	char name_memory[]="/Mymemory";

	mem=shm_open(name_memory, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
	
	if(mem<0)
	{
		perror("mem<0");
		return errno;
	}

	ssize_t mem_size=4096*n;
	
	if(ftruncate(mem,mem_size))
	{
		perror("ftruncate has problems");
		if(shm_unlink(name_memory)<0)
		{
			perror("unlink");
			return errno;
		}
		return errno;
	}

	for(i=0;i<n;i++)
	{
		
		void * memptr=mmap(0,4096,PROT_WRITE,MAP_SHARED,mem,i*4096);
		if(memptr==MAP_FAILED)
		{
		perror("MAP_FAILED_HERER");
		shm_unlink(name_memory);
		return errno;
		}
		int cx;
		pid_t pid=fork();
		if(pid<0)
		{
			perror(NULL);
			return errno;
		}
		else
		if(pid==0)
		{
		int a=v[i];
		cx=snprintf(memptr,4096,"%d: ",a);
		while(a>1)
		{
			cx+=snprintf(memptr+cx,4096-cx,"%d ",a);
			if(a%2==0)
			a=a/2;
			else
			a=a*3+1;
		}
		cx+=snprintf(memptr+cx,4096-cx,"%d\n",a);
		munmap(name_memory,4096);
		exit(0);
		}
	}
	for(i=0;i<n;i++)
	{	int pid_copil=wait(NULL);
		printf("Parent done: %d Child done: %d\n",getpid(),pid_copil);
	}
	for(i=0;i<n;i++)
	{	void *mem_ptr=mmap(0,4096,PROT_READ,MAP_SHARED,mem,i*4096);
		if(mem_ptr==MAP_FAILED)
		{
		perror(NULL);
		shm_unlink(name_memory);
		return errno;
		}
		printf("%s",(char *)mem_ptr);
		munmap(mem_ptr,4096);	
	}	

	shm_unlink(name_memory);
	printf("Done parent: %d, Me: %d",getppid(),getpid());
	return 0;
}