Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio
Grazie ad un mocio rotante che viene costantemente bagnato e pulito, Narwal Flow assicura un completo e capillare lavaggio dei pavimenti di casa. La logica di intellignza artificiale integrata guida nella pulizia tra i diversi locali, sfruttando un motore di aspirazione molto potente e un sistema basculante per la spazzola molto efficace sui tappeti di casa
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi
Con un prezzo di 2.999 euro, il Panasonic Z95BEG entra nella fascia ultra-premium dei TV OLED: pannello Primary RGB Tandem, sistema di raffreddamento ThermalFlow, audio Technics integrato e funzioni gaming avanzate lo pongono come un punto di riferimento
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione
Abbiamo provato per diverse settimane il nuovo Magic V5 di HONOR, uno smartphone pieghevole che ci ha davvero stupito. Il device è il più sottile (solo 4.1mm) ma non gli manca praticamente nulla. Potenza garantita dallo Snapdragon 8 Elite, fotocamere di ottima qualità e batteria in silicio-carbonio che garantisce un'ottima autonomia. E il Prezzo? Vi diciamo tutto nella nostra recensione completa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 20-12-2006, 21:03   #1
LimiT-MaTz
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?
__________________
MaTz!
LimiT-MaTz è offline   Rispondi citando il messaggio o parte di esso
Old 21-12-2006, 09:10   #2
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
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
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 21-12-2006, 11:10   #3
LimiT-MaTz
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;
}
in output avro':
Codice:
HERE
"dato ricevuto"
retval  1
retval  1
retval  1
retval  1
se vado a controllare p.revents è != da POLLIN, cio' nonostante poll() ritorna 1, nonostante in events abbia specificato solo POLLIN.

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.
__________________
MaTz!
LimiT-MaTz è offline   Rispondi citando il messaggio o parte di esso
Old 21-12-2006, 11:18   #4
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
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
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 21-12-2006, 11:45   #5
LimiT-MaTz
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.
__________________
MaTz!
LimiT-MaTz è offline   Rispondi citando il messaggio o parte di esso
Old 21-12-2006, 12:05   #6
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
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
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 21-12-2006, 13:00   #7
LimiT-MaTz
Senior Member
 
Iscritto dal: Apr 2003
Città: Genova
Messaggi: 673
Quote:
Originariamente inviato da ilsensine
Semplicemente, chiudi e riapri la pipe.
argh, non ci sono ancora...

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;
}
nulla da fare casualmente ogni tanto si looppa e spara in stdout una serie di retval 1.
__________________
MaTz!
LimiT-MaTz è offline   Rispondi citando il messaggio o parte di esso
Old 21-12-2006, 14:46   #8
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
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
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 21-12-2006, 14:53   #9
LimiT-MaTz
Senior Member
 
Iscritto dal: Apr 2003
Città: Genova
Messaggi: 673
effettivamente ...

Grazie come al solito sei stato gentilissimo!
__________________
MaTz!
LimiT-MaTz è offline   Rispondi citando il messaggio o parte di esso
Old 21-12-2006, 15:21   #10
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
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;
    }
La poll ritorna EINTR anche in corrispondenza di SIGSTOP+SIGCONT
__________________
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
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 22-12-2006, 10:34   #11
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da ilsensine
Fatti un favore, uccidi la select e usa la poll.
perché ? io l'ho usata per un progetto per la EdisonTel (2001) e sta ancora andando da quello che so
__________________
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
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 22-12-2006, 12:00   #12
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da trallallero
perché ?
Poco scalabile; interfaccia dubbia (limite di FD_SETSIZE "hardcoded" all'atto della compilazione).
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
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 22-12-2006, 12:48   #13
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da ilsensine
Poco scalabile; interfaccia dubbia (limite di FD_SETSIZE "hardcoded" all'atto della compilazione).
La poll è pià semplice e compatta, e non è legata a quell'assurda idea degli FD_SET.
ero convinto di aver usato la select ma in effetti non c'entra niente
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
trallallero è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio Narwal Flow: con il mocio orizzontale lava i pav...
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi Panasonic 55Z95BEG cala gli assi: pannello Tande...
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione HONOR Magic V5: il pieghevole ultra sottile e co...
Recensione Google Pixel 10 Pro XL: uno zoom 100x assurdo sempre in tasca (e molto altro) Recensione Google Pixel 10 Pro XL: uno zoom 100x...
Lenovo IdeaPad Slim 3: un notebook Snapdragon X economico Lenovo IdeaPad Slim 3: un notebook Snapdragon X ...
Ayaneo Pocket Air Mini: la retro console...
Amazon sfida tutti: crollano iPhone e Ma...
MacBook Pro con chip M4 a 1.649€ e MacBo...
Dreame a IFA 2025: robot capaci di salir...
AirPods 4 contro AirPods Pro 2: Amazon l...
Amazon in furore da sconti: tutti gli iP...
RTX Hair in Indiana Jones e l'Antico Cer...
Robot aspirapolvere super scontati su Am...
Windows Mixed Reality: un ingegnere Micr...
Qualcomm: Intel non è ancora pron...
BMW e Qualcomm lanciano Snapdragon Ride ...
Google nella bufera, multata dall'UE per...
Huawei rinnova la sua gamma di cuffie: e...
La connettività satellitare di Am...
MOVA ha presentato un robot aspirapolver...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 12:09.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v