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_handler, old_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())<0 )
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 fd, risp;
struct sigaction new_handler, old_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