|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Apr 2003
Città: Genova
Messaggi: 673
|
Select() Posix: grattacapo
Codice:
#include <stdio.h> #include <sys/select.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> #include <stdlib.h> int main() { int fd = 0; char * value= (char *) malloc (sizeof(char) * 100); int retval; int len = 0; fd_set rfds; fd = open("/home/matz/fifo", O_RDONLY); for(;;){ FD_ZERO(&rfds); FD_SET(fd, &rfds); retval = select(fd + 1 , &rfds, NULL, NULL, NULL); printf("retval %d\n",retval); if (retval == -1) { fprintf(stderr, "select failed:"); return -1; } else{ if (FD_ISSET(fd, &rfds)) { len = read(fd, value, 100); value[len]='\0'; printf("%s",value); } } } return 0; } /* dopo aver letto per la prima volta un dato dalla fifo ad ogni ciclo successivo continua a vedere retval = 1 e il fd registrato nell'insieme rfds */ /home/matz/fifo è una fifo. Lancio il programmino lui entra nella select e rimane in attesa. Un altro processo scrive sulla fifo a questo punto il "programmino" si sveglia e stampa su stdout il dato. Fin qui tutto ok. Ora vengono i problemi: rinizia il ciclo riazzero l'insieme rfds inserisco fd nell'insieme entro nella select ma NON MI FERMO (nessun processo ci ha scritto sopra). Non riesco a capire perchè cio' accada ... Sapreste aiutarmi? |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Hai raggiunto una condizione di EOF; puoi controllare che la read ritorna 0.
Fatti un favore, uccidi la select e usa la poll.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Apr 2003
Città: Genova
Messaggi: 673
|
ok, accetto il tuo consiglio per quanto riguarda la poll.
Codice:
int main() { int fd = 0; char * value= (char *) malloc (sizeof(char) * 100); int retval; int len = 0; struct pollfd p; fd = open("/home/matz/fifo", O_RDONLY); for(;;){ p.fd = fd; p.events = POLLIN; retval = poll(&p, 1, 0); printf("retval %d\n",retval); if (retval == -1) { fprintf(stderr, "select failed:"); return -1; } else{ if(p.revents == POLLIN) { printf("HERE"); len = read(fd, value, 100); value[len]='\0'; printf("%s",value); } } } return 0; } Codice:
HERE "dato ricevuto" retval 1 retval 1 retval 1 retval 1 questo nn mi torna: Codice:
RETURN VALUE On success, a positive number is returned; this is the number of structures which have non-zero revents fields (in other words, those descriptors with events or errors reported). A value of 0 indicates that the call timed out and no file descriptors were ready. On error, -1 is returned, and errno is set appropriately. |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Torna, torna. Il pipe è stato chiuso dall'altro lato, e revents ritorna l'evento come POLLHUP. Gli eventi di errore vengono _sempre_ ritornati, anche se non li hai richiesti.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Apr 2003
Città: Genova
Messaggi: 673
|
la situazione diventa problematica...
ti spiego quello che volevo fare: un processo multitread che ascoltasse i comandi sulla pipe e in base a questi facesse delle operazioni. La mia idea era quella di usare una fifo e leggere da questa quando si presentavano dei dati usando appunto un meccanismo (select). Visti gli sviluppi ora non so come comportarmi. |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Semplicemente, chiudi e riapri la pipe.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Apr 2003
Città: Genova
Messaggi: 673
|
Quote:
Codice:
int main() { int fd = 0; char * value= (char *) malloc (sizeof(char) * 100); int retval; int len = 0; struct pollfd p; fd = open("/home/matz/fifo", O_RDONLY); for(;;){ p.fd = fd; p.events = POLLIN; retval = poll(&p, 1, 0); printf("retval %d\n",retval); if (retval == -1) { fprintf(stderr, "select failed:"); return -1; } else{ if(p.revents == POLLIN){ printf("POLLIN\n"); len = read(fd, value, 100); value[len]='\0'; printf("%s\n",value); } if(p.revents == POLLHUP){ printf("POLLHUP"); close(fd); open("/home/matz/fifo", O_RDONLY); } } } return 0; } |
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Che casotto che hai fatto...
Codice:
int main() { int fd; char * value= malloc (sizeof(char) * 100); int retval; int len; struct pollfd p; p.events = POLLIN; fd = open("/home/matz/fifo", O_RDONLY); while(fd>=0){ p.fd = fd; retval = poll(&p, 1, -1); printf("retval %d\n",retval); if (retval == -1) { perror("poll"); return -1; } if(p.revents & POLLIN){ printf("POLLIN\n"); len = read(fd, value, 99); if (len>=0) { value[len]='\0'; printf("%s\n",value); } else perror("read"); } else if(p.revents & POLLHUP){ printf("POLLHUP\n"); close(fd); fd = open("/home/matz/fifo", O_RDONLY); } } perror("open"); return -1; }
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Volendo essere pignoli, c'è ancora un "piccolo" errore:
Codice:
if (retval == -1) { if (errno!=EINTR) { perror("poll"); return -1; } continue; } ![]()
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
La poll è pià semplice e compatta, e non è legata a quell'assurda idea degli FD_SET.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
![]() Ho rivisto il codice, ho usato socket, accept, setsockopt... Uff, non mi ricordo neanche piú questa roba a furia di pro*ciare e di burocrazia aziendale ![]()
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:09.