Scusate se disturbo ancora. Sono riuscito a superare il problema di cui sopra modificando il codice. Ho il problema però che adesso uscendo dal programma ho un errore di stack smashing detected e segmentation fault. La cosa strana è che l'errore me lo da in uscita dopo che tutte le operazioni sono andate a buon fine. Ringrazio in anticipo per i suggerimenti.
Codice PHP:#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#define PERM 0777
main(){
char codice[13]; //il barcode è EAN 13
char nome[15],nome1[15],nome2[15];
char ext1[]=".ps";//Stringa per estensione .ps
char ext2[]=".jpg";//Stringa per estensione .jpg
FILE *pb;//Descrittore di file per la pipe convert | barcode
FILE *fps;//Descrittore del file .ps
FILE *fjpg;//Descrittore per il test dell'esistenza del file jpg
char rb[]="barcode -b ";
int n;//Variabile per la lettura caratteri dalla pipe
char e;//Variabile per controllo uscita finale
pid_t pconvert,pmostra;//pid per il processo che converte il file .ps e per il processo che lancia Image Viewer
printf("\nInserire il codice EAN\n");
scanf("%s", codice);
printf("\nInserire il nome del prodotto\n");
scanf("%s", nome);
strcpy(nome1,nome);
strcpy(nome2,nome);
strcat(nome1,ext1);
strcat(nome2,ext2);
strcat(rb,codice);
strcat(rb," n -E -e ean -u mm -g 60x25+1+1");
fps=fopen(nome1,"w");
if((pb=popen(rb,"r"))==NULL){
printf("Errore popen non riuscita\n");
exit(-1);
}
while((n=fgetc(pb)) != EOF ){//Copia dalla pipe al file
fputc(n,fps);
}
pclose(pb);
fclose(fps);
pconvert=fork();//crea un processo per lanciare il comando convert e lasciare il processo padre aperto per eseguire i comandi successivi
if(pconvert < 0){
printf("Fork per conversione file fallita\n");
exit(-2);
}
if(pconvert == 0){//sono nel processo figlio per la conversione del file
execlp("convert","convert",nome1,nome2,NULL);
}
if(pconvert>0){
wait(NULL);//sono nel processo padre e aspetto che termini la conversione
unlink(nome1);//Cancello il file .ps
pmostra=fork();//crea un processo per lanciare Image Viewer
if(pmostra < 0){
printf("Fork per Image Viewer fallita\n");
exit(-3);
}
if(pmostra == 0){//sono nel processo figlio per il lancio dell'applicazione gimp
fjpg=fopen(nome2,"rb");
if(fjpg == NULL){
printf("Errore, conversione a jpg non riuscita\n");
exit(-4);
}
execlp("gpicview","gpicview",nome2,NULL);//lancia l'apertura del nuovo file con Image Viewer
}
if(pmostra>0){
printf("Premere il tasto e per chiudere Image Viewer e uscire\n");
while(e != 'e'){
scanf("%c",&e);
}
}
kill(pmostra,SIGTERM);//Termina Image Viewer
}
wait(NULL);//Aspetta la fine di tutti i processi figli
return 0;
}

Rispondi quotando