#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>
#include <math.h>
#include <semaphore.h>
#include <sys/mman.h>
#include <sys/sem.h>
int main (int argc, char *const argv[])
{
int nread,j,ret,fd,fdm,fdh,wile=0;//variables varias
int cont_a=0,cont_e=0,cont_i=0,cont_o=0,cont_u=0;//contadores de vocales
char * arch=NULL,* ord=NULL,*pr;
char *ptr,*ptrp,*ptrh;
char buf[256],bufa[20],bufb[20],bufs[256],bufcontp[256],bufconta[256],bufconthp[256],bufcontahp_p[256],bufcontehp_p[256],bufcontihp_p[256],bufcontohp_p[256],bufcontuhp_p[256];
// float a,e,i,o,u,A,E,I,O,U,porc_a,porc_e,porc_i,porc_o,porc_u,total,porctotal;
//MANEJO DE ARGUMENTOS
while((ret=getopt(argc, argv, "f: o:"))>0)
{
switch(ret)
{
case'f':
arch=optarg;
break;
case'o':
ord=optarg;
break;
}
}
if (!arch)
{
perror( "ERROR: Ingrese una archivo valido\n");
exit(1);
}
sem_t *semaforo;
sem_t *semaforo2;
sem_t *semaforo3;
semaforo=sem_open("semaforo",O_CREAT|O_RDWR,0600,0);
semaforo2=sem_open("semaforo2",O_CREAT|O_RDWR,0600,0);
semaforo3=sem_open("semaforo3",O_CREAT|O_RDWR,0600,0);
fd=open(arch,O_RDONLY,0777);
fdm=shm_open("memoria",O_CREAT|O_RDWR,0660);
fdh=shm_open("memoria_sumarizador",O_CREAT|O_RDWR,0660);
if(ftruncate(fdm,20) <0){
perror ("Truncate()");
}
ptrp=mmap(NULL,20,PROT_READ|PROT_WRITE,MAP_SHARED,fdm,0);
ptrh=mmap(NULL,20,PROT_READ|PROT_WRITE,MAP_SHARED,fdh,0);
close(fdm);
close(fdh);
switch(fork())
{
case -1: perror("fork()");
exit(EXIT_FAILURE);
case 0:
do
{
sem_wait(semaforo2);
strncpy(bufb,ptrp,20);
printf("El bufer es =%s\n",bufb);
for (j=0;j<20;j++)
{
if(bufb[j]=='a')
{
cont_a++;
}
if(bufb[j]=='A')
{
cont_a++;
}
}
printf("La cantidad de a es %d\n",cont_a);
snprintf(bufconta,10,"a%d;",cont_a);
// printf("bufconta es %s\n",bufconta);
}
while(bufa[19]!='*');
strncpy(ptrh,bufconta,20);
// sem_post(semaforo3);
/*snprintf(bufconta,10,"a%d;",cont_a);
strncpy(ptrh,bufconta,4);
printf("bunfconta es %s\n",bufconta);*/
return (0);
}
//HIJO SUMARIZADOR
switch (fork())
{
case -1:
perror("fork()");
exit(EXIT_FAILURE);
case 0:
sem_wait(semaforo3);
strncpy(bufs,ptrh,20);
printf("El bufs es igual a %s\n",bufs);
sem_post(semaforo);
return (0);
}
//PADRE
while((nread=read(fd,bufa,20)) >0)
{
if(nread<20)
{
bufa[19]='*';
}
strncpy(ptrp,bufa,nread);
sem_post(semaforo2);
sem_post(semaforo3);
sem_wait(semaforo);
}
sem_unlink("/semaforo");
sem_unlink("/semaforo2");
sem_unlink("/semaforo3");
return 0;
}