Pagini recente » Cod sursa (job #3159947) | Cod sursa (job #1864231) | Cod sursa (job #2576090) | Cod sursa (job #569867) | Cod sursa (job #2072627)
#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;
}