cifa
18-07-2012, 20:21
Sto studiando un po' di IPC e sto trovando un problemino con le pipe. Ho una situazione con vari programmi:
A: Fa un exec su B e si mette in wait
B: Riceve da un terzo programma una stringa e la deve rimandare ad A
Pensavo di aprire una pipe in A prima dell'exec e passare fd[1] a B come argomento
if(pipe(fd)==-1){
perror("Pipe Failed");
myExit(EXIT_FAILURE);
}
close(fd[1]);
sprintf(fdString,"%d",fd[1]);
.......
if((int)(pid=fork())>0)
waiting(status);
else if(pid==0){
close(fd[0]);
execl("./B","B",fdString,(char*)0);
perror("Exec failed");
myExit(EXIT_FAILURE);
}
Ed in B:
int fd=atoi(argv[1]);
//Receive string from C
len=strlen(string)+1;
if(write(fd,&len,sizeof(int))==-1){
perror("Error on writing length");
exit(EXIT_FAILURE);
}
if(write(fd,&string,len)==-1){
perror("Error on writing string");
exit(EXIT_FAILURE);
}
Il mio problema ora č leggere la stringa in A. Pensavo di mandare SIGUSR1 ad A appena la stringa viene scritta da B, avendo in A qualcosa del tipo:
signal(SIGUSR1, signalHandler);
........
static void signalHandler(int signo){
switch(signo){
case SIGUSR1:
listen();
break;
default: break;
}
}
........
static void listen(){
int len;
if(read(fd[0],&len,sizeof(int))<sizeof(int)){
perror("Error reading len");
myExit(EXIT_FAILURE);
}
char string[len];
if(read(fd[0],string,len)<len){
perror("Error reading string");
myExit(EXIT_FAILURE);
}
printf("String: %s with length %d\n", string, len);
}
Quello perņ che ottengo č Error reading len: Success
Cosa sbaglio ?
Grazie mille in anticipo :)
EDIT: Risolto, chiudevo fd[0] prima della fork, quindi ovviamente B lo trovava chiuso!
A: Fa un exec su B e si mette in wait
B: Riceve da un terzo programma una stringa e la deve rimandare ad A
Pensavo di aprire una pipe in A prima dell'exec e passare fd[1] a B come argomento
if(pipe(fd)==-1){
perror("Pipe Failed");
myExit(EXIT_FAILURE);
}
close(fd[1]);
sprintf(fdString,"%d",fd[1]);
.......
if((int)(pid=fork())>0)
waiting(status);
else if(pid==0){
close(fd[0]);
execl("./B","B",fdString,(char*)0);
perror("Exec failed");
myExit(EXIT_FAILURE);
}
Ed in B:
int fd=atoi(argv[1]);
//Receive string from C
len=strlen(string)+1;
if(write(fd,&len,sizeof(int))==-1){
perror("Error on writing length");
exit(EXIT_FAILURE);
}
if(write(fd,&string,len)==-1){
perror("Error on writing string");
exit(EXIT_FAILURE);
}
Il mio problema ora č leggere la stringa in A. Pensavo di mandare SIGUSR1 ad A appena la stringa viene scritta da B, avendo in A qualcosa del tipo:
signal(SIGUSR1, signalHandler);
........
static void signalHandler(int signo){
switch(signo){
case SIGUSR1:
listen();
break;
default: break;
}
}
........
static void listen(){
int len;
if(read(fd[0],&len,sizeof(int))<sizeof(int)){
perror("Error reading len");
myExit(EXIT_FAILURE);
}
char string[len];
if(read(fd[0],string,len)<len){
perror("Error reading string");
myExit(EXIT_FAILURE);
}
printf("String: %s with length %d\n", string, len);
}
Quello perņ che ottengo č Error reading len: Success
Cosa sbaglio ?
Grazie mille in anticipo :)
EDIT: Risolto, chiudevo fd[0] prima della fork, quindi ovviamente B lo trovava chiuso!