Scusami se approfitto della tua gentilezza. Il codice è questo:
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[14]; //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");
printf("rb %s \n",rb);
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);
}
fclose(fps);
pclose(pb);
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);
}
fclose(fjpg);
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;
}
L'istruzione forse più sospetta potrebbe essere la copia di caratteri del file postscript eseguita dalla pipe. Però il file viene convertito ed eliminato correttamente, il che mi fa pensare che l'istruzione sia corretta.