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'){
                             
scanf("%c",&e);
                            }
                          }
            
kill(pmostra,SIGTERM);//Termina Image Viewer
            
}
        
wait(NULL);//Aspetta la fine di tutti i processi figli
        
return 0;
        }