PDA

View Full Version : [C] Problemi con fork+exec & segnali


kily2001
28-07-2009, 08:00
ciao a tutti,

ho un problema in questi 2 programmi.

prog1.c:
#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.

prog2.c
#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 :D