Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Uso de semáforos en C linux

Estas en el tema de Uso de semáforos en C linux en el foro de C/C++ en Foros del Web. Hola como están estoy haciendo un programa que el padre lea de un archivo y lo que va leyendo lo meta a la memoria compartida ...
  #1 (permalink)  
Antiguo 01/11/2008, 13:19
 
Fecha de Ingreso: enero-2008
Mensajes: 53
Antigüedad: 16 años, 3 meses
Puntos: 0
Uso de semáforos en C linux

Hola como están estoy haciendo un programa que el padre lea de un archivo y lo que va leyendo lo meta a la memoria compartida lo que necesito es como hacer con semaforos que el padre escriba y lea el hijo contador y el hijo sumarizador lea antes que termine el programa.


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;
}
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:51.