ciao a tutti,

ho un problema in questi 2 programmi.
Codice PHP:
prog1.c:
Codice PHP:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <signal.h>

#define fifo1 "/tmp/fifo1"

static void signal_handler(int sign)
{
    if(
sign==SIGCHLD){
        
pid_t status;
        
wait(&status);
    }
}

int main (void)
{

    
char cmd[256],buf[256];
    
int risp,pid,fd;

    
struct sigaction new_handlerold_handler;

    
new_handler.sa_handler signal_handler;
    
sigemptyset (&new_handler.sa_mask);
    
new_handler.sa_flags 0;

    
sigaction(SIGCHLD,&new_handler, &old_handler);

    while(
1) {
            
printf("insert command: ");
            
fgets(cmd,sizeof(cmd),stdin);
                
            
cmd[strlen(cmd)-1]='\0';
            
            if(
strcmp(cmd,"start")==0){

                if( (
pid=fork())<)
                    
printf("[fork()]: errore\n");
                else
                    if(
pid==0){//codice del figlio
                        
pid_t pid=getpid();
                        
execlp("./prog2","prog2",(char*)0);//chiamo prog2
                    
}
                        
                    else if(
pid>0){//codice del padre    
                        
fd=open(fifo1,O_RDONLY);
                        
read(fd,&buf,sizeof(buf));
                        
close(fd);//leggo dalla FIFO
                        
                        
printf("%s\n",buf);//scrivo risultato                
                    
}        
            }
            else{
                if (
strcmp(cmd,"stop")==0){
                    
kill(pid,SIGUSR1);
                }
                else {
                    
printf("[%s]: comando errato\n"cmd);
                }
            }
    }

prog1.c presenta un prompt all'utente: se viene digitato start viene creato un figlio con fork() e viene eseguito il programma prog2 il cui file sorgente è prog2.c, se viene digitato stop viene mandato SIGUSR1 a prog2 (per terminare) e se il comando è errato stampa l'errore. Il ciclo continua all'infinito.
I 2 processi comunicano tramite una FIFO, in pratica prog1 stampa una stringa comunicata da prog2.

Codice PHP:
prog2.c
Codice PHP
:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <signal.h>
#include <malloc.h>

#define fifo1 "/tmp/fifo1"

static void signal_handler(int sign)
{
    
unlink(fifo1);
    exit(
0);
}

int main(void)
{
    
int x=0;
    
char buf[]="prog2 avviato";
    
int fdrisp;

    
struct sigaction new_handlerold_handler;

    
new_handler.sa_handler signal_handler;
    
sigemptyset (&new_handler.sa_mask);
    
new_handler.sa_flags 0;

    
sigaction(SIGUSR1,&new_handler, &old_handler);//se ricevo SIGUSR1 termino e cancello la fifo

    
mkfifo(fifo1,0777);

    
fd=open(fifo1,O_WRONLY);
    
write(fd,&buf,sizeof(buf));
    
close(fd);

    while(
1){ //continua all'infinito
        
x++;
    }

se prog2 riceve SIGUSR1 cancella la FIFO e ritorna.

Il mio problema è che vengono dduplicati in comandi: ad esempio, digito stop e invece di tornare al prompt riesegue il comando stop (o meglio, stampa errore poichè viene troncata l'ultima lettera).

Come posso fare?

grazie mille