C/libev:el programa se cierra cuando se desencadena el evento de
Pregunta
Tengo el siguiente libev código:
#include <ev.h>
#include <stdio.h>
#include <errno.h>
#include <sys/socket.h>
#include <resolv.h>
#include <string.h>
#include <stdlib.h>
#include <sys/un.h>
#include <netinet/in.h>
ev_io stdin_watcher;
static void cb(EV_P_ ev_io *w, int revents){
puts ("hello");
//read file here - suggestion due to Ioan
#define BUF_LEN 10
char buf[BUF_LEN];
memset(buf,0,BUF_LEN);
int byte_read;
while( (byte_read = recv(w->fd,buf,BUF_LEN-1,0)) > 0) {
printf("len: %i: %s",byte_read,buf);
memset(buf,0,BUF_LEN);
}
if(-1 == byte_read && EAGAIN != errno) {
perror("recv");
}
close(w->fd);
//ev_io_stop (EV_A_ w);
//ev_unloop (EV_A_ EVUNLOOP_ALL);
}
int main (void){
struct ev_loop *loop = ev_default_loop (0);
int len;
int sd;
sd=socket(AF_UNIX,SOCK_STREAM,0);
struct sockaddr_un address;
//memset(&address,0,sizeof(address));
address.sun_family=AF_UNIX;
strcpy(address.sun_path,"/tmp/mysocket");
unlink(address.sun_path);
len=strlen(address.sun_path)+sizeof(address.sun_family);
int x=bind(sd,(struct sockaddr*)&address,sizeof(address));
printf("%d\n",x);
listen(sd,5);
ev_io_init(&stdin_watcher,cb,sd,EV_READ);
ev_io_start(loop,&stdin_watcher);
ev_loop (loop, 0);
// unloop was called, so exit
return 0;
}
Todo funciona bien (casi).Compilar: gcc file.c -lev
, y ejecutar ./a.out
.A continuación, escribir en el socket que ./a.out
escucha: echo "gobblydeegook" | nc -U /tmp/mysocket
.
Hola aparece en la consola como se esperaba.
Pero el programa llama al evento y, a continuación, mantiene imprimir "hola" ad-infinitum!Yo quiero continuar en el seguimiento de este socket de unix para las escrituras.Cómo hacer esto?
Solución
El evento se llama cuando hay datos que se leen en el zócalo.Puesto que usted no es la eliminación de los datos de la toma, se acaba de imprimir "hola", el evento se llama de nuevo para usted para manejar los datos.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow