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);
}
