Jump to content
williampmb

Comunicacao entre Processos

Recommended Posts

Ola,

 

Preciso fazer um programa que consiga fazer comunicacao entre dois processos utilizando pipes com chamadas de sistemas. Estou usando semaforo para tal. Tudo ia muito bem ate que nao consigo entender porque o que escrevo no pipe pela segunda vez eh perdido no loop while. Pf, me deem uma luz.

#include <stdio.h>          /* printf()                 */
#include <stdlib.h>         /* exit(), malloc(), free() */
#include <sys/types.h>      /* key_t, sem_t, pid_t      */
#include <sys/shm.h>        /* shmat(), IPC_RMID        */
#include <errno.h>          /* errno, ECHILD            */
#include <semaphore.h>      /* sem_open(), sem_destroy(), sem_wait().. */
#include <fcntl.h>          /* O_CREAT, O_EXEC          */


int main (int argc, char **argv){
    int i;                        /*      loop variables          */
    key_t shmkey;                 /*      shared memory key       */
    int shmid;                    /*      shared memory id        */
    sem_t *sem, *semM,*semJ;                   /*      synch semaphore         *//*shared */
    pid_t pid;                    /*      fork pid                */
    pid_t joao;                    /*      fork pid                */
    pid_t maria;                    /*      fork pid                */
    int *p;                       /*      shared variable         *//*shared */
    unsigned int n;               /*      fork count              */
    unsigned int value;           /*      semaphore value         */
    char buffer[255];
    FILE *file1;
	FILE *file2;

    /* initialize a shared variable in shared memory */
    shmkey = ftok ("/dev/null", 5);       /* valid directory name and a number */
    
    printf ("shmkey for p = %d\n", shmkey);
    shmid = shmget (shmkey, sizeof (int), 0644 | IPC_CREAT);
    if (shmid < 0){                           /* shared memory error check */
        perror ("shmget\n");
        exit (1);
    }

    p = (int *) shmat(shmid, NULL, 0);   /* attach p to shared memory */
    *p = 0;
    printf("p=%d is allocated in shared memory.\n\n", *p);

    /********************************************************/
    
    printf("What do you want the semaphore value to be?\n");
    printf("Semaphore value: ");
    scanf("%u", &value);

    /* initialize semaphores for shared processes */
    sem = sem_open("pSem", O_CREAT | O_EXCL, 0644, value);
    semJ = sem_open("semJoao", O_CREAT | O_EXCL, 0644,0);
    semM = sem_open("semMaria", O_CREAT | O_EXCL, 0644,0);  
    /* name of semaphore is "pSem", semaphore is reached using this name */
    sem_unlink("pSem");
    sem_unlink("semJoao");    
sem_unlink("semMaria");      
    /* unlink prevents the semaphore existing forever */
    /* if a crash occurs during the execution         */

    printf ("semaphores initialized.\n\n");

    int pipeJoao[2]; //pipe do filho 1
	int pipeMaria[2]; //pipe do filho 2
    
    if(pipe(pipeJoao) < 0){
		perror("pipe1");
		return -1;
	}
	if(pipe(pipeMaria) < 0){
		perror("pipe1");
		return -1;
	}
    
    int parent = 1;
    pid = fork();
    if(pid == 0 && parent == 1){
        
        parent = 0;
        file1 = fopen("a.txt","a+");
        if(!file1){
            printf("Error! opening programaTxt1 file");
			exit(1);
        }
        
        while (1){
		
			
		sem_wait(semJ);
				
		sem_wait(sem);
		
		printf("Joao lendo PID = %d\n", getpid());
		//close(pipeJoao[1]);     
		read(pipeJoao[0],buffer,sizeof(buffer));
		printf("Joao leu do pipe: %s\n", buffer);

		file1 = fopen("a.txt","w");
		if(!file1){
		    printf("Error! opening programaTxt1 file");
				exit(1);
		}
		//fseek(file1,0,SEEK_END);
		fputs(buffer, file1);
		fclose(file1);
		
		//__fpurge(buffer);
		
		sem_post(sem);
		
		sleep(5);

		sem_wait(sem);
		
		printf("Joao escrevendo PID = %d\n", getpid());
		file1 = fopen("a.txt","r");
		if(!file1){
		    printf("Error! opening programaTxt1 file");
				exit(1);
		}
		//fseek(file1,0,SEEK_SET);
		//fgets(buffer, 255, file1);
		fscanf(file1,"%[^\n]",buffer);		
		fclose(file1);
		//close(pipeMaria[0]);
		write(pipeMaria[1],buffer,sizeof(buffer)+1);
		
		sem_post(sem);
		
		sem_post(semM);	
		sleep(10);
        }
	}else{
        pid = fork();
    }

    if(pid == 0 && parent == 1){
	
	file2 = fopen("b.txt","a+");
	if(!file2){
	    printf("Error! opening programaTxt1 file");
			exit(1);
	}
	
	while (1){
		
		sem_wait(sem);
		printf("Maria escrevendo PID = %d\n", getpid());

		file2 = fopen("b.txt","r");
		if(!file2){
		    printf("Error! opening programaTxt1 file");
				exit(1);
		}
		//fseek(file2,0,SEEK_SET);
		//fgets(buffer, 255, file2);
		fscanf(file2,"%[^\n]",buffer);		
		//fscanf(file2, "%s", buffer);
		printf("Lido do arquivo da Maria: %s\n",buffer);		
		
		//close(pipeJoao[0]);
		write(pipeJoao[1], buffer,sizeof(buffer)+1);
		printf("Escrito no pipe do Joao: %s\n", buffer);
		fclose(file2);
		
		sem_post(sem);
		
		sem_post(semJ);
		sleep(5);
		sem_wait(semM);		
		
		sem_wait(sem);
		printf("Maria lendo PID = %d\n", getpid());
		//close(pipeMaria[1]);
		read(pipeMaria[0], buffer,sizeof(buffer));
		printf("Lido do pipe Maria: %s\n",buffer);

		file2 = fopen("b.txt","w");
		if(!file2){
		    printf("Error! opening programaTxt1 file");
				exit(1);
		}	
		//fseek(file2,0,SEEK_END);
		fputs(buffer, file2);
		        
		printf("Maria escreveu no arquivo: %s\n", buffer);
		
		//__fpurge(buffer);
		fclose(file2);
		
		sem_post(sem);
		sleep(10);
	
	}
     }
    
    if(pid != 0){
        while (pid = waitpid (-1, NULL, 0)){
            if (errno == ECHILD)
                break;
        }

        printf ("\nParent: All children have exited.\n");

        /* shared memory detach */
        shmdt (p);
        shmctl (shmid, IPC_RMID, 0);

        /* cleanup semaphores */
        sem_destroy (sem);
        exit (0);
    }
}

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Vandson Fernandes de Deus
      Quero criar um jogo onde fotos públicas de políticos conhecidos e odiados serão destruídas pelo jogador. É crime usar a imagem de tais políticos no game? Eu poderia responder por uso de imagem mesmo as fotos sendo públicas?
    • By wBB
      Olá!
      Preciso criar uma rotina totalmente síncrona, como um semáforo, usando Javascript (ou jQuery, ou NodeJS, etc...). Como comecei recentemente a usar Javascript e estou mais acostumado com linguagens no padrão "C", não tenho ideia de como fazer isso numa linguagem assíncrona. Andei verificando por aí e estou quase convencido que terei que mudar de linguagem para resolver esse problema...
      Alguém pode me dar umas dicas?
      Obrigado.
    • By SmartTraffic
      Eai galera, estou fazendo um trabalho da minha faculdade, é um algoritmo inteligente que conecta em um sensor em vias movimentadas para o controle de trafego, deem uma olhada ai, e se possível comentem la oque você acham, e o que poderia mudar, agradeço desde já!!!
       
      http://smarttrafficmrg.blogspot.com.br/
    • By wneo
      Boa noite galera...
      Estou abrindo esse topico para saber o que vcs pensam em relação a processo de desenvolvimento em uma equipe...
      Me deparo com diversidade de pensamentos nesse sentido, msmo parecendo algo óbvio.
      Pensando em front-end e back-end, ao iniciar uma nova aplicação, como fica a distribuição do projeto... o back-end entra no desenvolvimento somente depois que o front já realizou todo seu trabalho?
    • By gujabared
      Bom dia!

      Sou iniciante aqui no fórum, mas percebi que dão bastante atenção aos problemas postados.

      Há alguns dias precebi alguns problemas com programas (ex: players: wmp, bs player) que não executavam mais e estavam rodando em processo.

      Fiz a restauração do sistema, voltei alguns dias, mas em pouco tempo o problema retornou. Desisntalei esses dois players e baixei o kode (xbmc), mas quando tento a instalação vejo que só roda em processo.

      Desconfio que tenho alguma contaminação que o meu antivirus (Comodo) não perceba.

      Podem me ajudar?
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.