Código:
#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; }