[C] Produttore - Consumatore problema

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Zanarkand
Prode Principiante
Messaggi: 26
Iscrizione: domenica 18 dicembre 2016, 20:11
Sesso: Maschile

[C] Produttore - Consumatore problema

Messaggio da Zanarkand »

Salve,
ritorno qui come di consueto perché ho problemi con un programma in C.
In pratica dovrei forkare due figli uno dei quali legge stringhe da stdin, le invia utilizzando un file di testo al fratello che le converte in stringhe in maiuscolo e le visualizza su stdout. termina con la stringa "end".
Il problema si verifica sull'output e penso che l'intoppo sia nella read del figlio consumatore poiché l'output della stringa stringtoup in cui memorizzo ogni stringa presa dal file per convertirla non viene visualizzata con la printf mentre il '\n' si. Sia per la print prima sia dopo la conversione.

In pratica se inserisco la stringa : "ciao" (printando sia prima sia dopo la conversione) in output vengono visualizzati 2 '\n'
Vi assicuro che il file viene scritto dal primo figlio.

ecco il codice

Codice: Seleziona tutto

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <errno.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>
#include <ctype.h>
#include <fcntl.h>
#define MAXC 30

pid_t pids[2];
int lenght;

static void signalHandler(int signo)
{
  return;
}

int main()
{
  int i,  nR, fd;
  char string[MAXC+1], stringtoup[MAXC+1];
  signal(SIGINT, SIG_DFL);
  signal(SIGUSR1, signalHandler);
 
  for(i=0; i<2; i++)
    {
      pids[i]=fork();
      if(pids[i]==0)
	{
	  if(i==0)
	    {
	      if((fd=open("file.txt", O_WRONLY | O_CREAT | O_SYNC, S_IRWXU))==-1)
		 {
		   perror("error opening file.txt!\n");
		   exit(1);
		 }
	      fprintf(stdout, "Insert strings (max 30 chars), finish with 'end'\n");
	      fscanf(stdin, "%s", string);
	      while(strcmp(string, "end")!=0)
		{
		  lenght=strlen(string);
		  write(fd, string, lenght);
		  sleep(1);
		  kill(pids[1], SIGUSR1);
		  pause();
		  fprintf(stdout, "Insert string:\n");
		  fscanf(stdin, "%s", string);
		}
	      close(fd);
	      kill(pids[1], SIGINT);
	    }
	  else
	    {
	       if((fd=open("file.txt", O_RDONLY))==-1)
		 {
		   perror("error opening file.txt!\n");
		   exit(1);
		 }
	      pause();
	      while((nR=read(fd, stringtoup, lenght))==lenght)
		{
		  if(nR!=lenght)
		    {
		      perror("nR!=nW\n");
		      exit(1);
		    }
		  sleep(1);
		  kill(pids[0], SIGUSR1);
		  stringtoup[nR]='\0';
		  fprintf(stdout, "%s\n", stringtoup);
		  fflush(stdout);
		  for(int j=0; j<nR; j++)
		    stringtoup[j]=toupper(stringtoup[j]);

		  fprintf(stdout, "%s\n", stringtoup);
		  fflush(stdout);
		  pause();
		}
	      close(fd);
	    }
	  exit(0);
	}
    }
  for(i=0; i<2; i++)
    waitpid(pids[i], NULL, 0);

  return(0);
}

Avatar utente
vbextreme
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1214
Iscrizione: domenica 12 gennaio 2014, 14:06
Desktop: lxde
Distribuzione: xubuntu 14.10

Re: [C] Produttore - Consumatore problema

Messaggio da vbextreme »

Per leggere l'input usa "fgets()" al posto di scanf
Easy framework per il linguaggio C.
vbextreme hack your life
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 5 ospiti