Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Samsung Micro RGB R95H, il primo LCD a LED rossi, verdi e blu di Samsung alla prova del banco di misura
Samsung Micro RGB R95H, il primo LCD a LED rossi, verdi e blu di Samsung alla prova del banco di misura
Il primo Micro RGB di Samsung per il salotto è il 65 pollici da 2.749 euro. Sul banco di misura abbiamo rilevato 2.000 nit di picco, nero assoluto con il local dimming e il 91,4% del BT.2020, il colore più ampio che abbiamo misurato su un LCD
iPhone 18 Pro: la recensione del miglior iPhone compatto di sempre
iPhone 18 Pro: la recensione del miglior iPhone compatto di sempre
Apple ha rinnovato iPhone 18 Pro soprattutto dentro: chip A20 Pro a 2 nm con memoria affiancata al SoC, camera di vapore tre volte più ampia, Dynamic Island più piccola del 25% grazie a Face ID sotto il display e fotocamera principale con diaframma variabile da f/1.48 a f/4. Lo abbiamo misurato al colorimetro e nei benchmark, usato con iOS 27 e messo alla prova in fotografia tra laghi, borghi e interni poco illuminati
Panasonic, 30 anni di Toughbook: la "Bibbia" di mille regole dietro i nuovi G3 e 34
Panasonic, 30 anni di Toughbook: la "Bibbia" di mille regole dietro i nuovi G3 e 34
A Londra, per il trentennale dei Toughbook, Panasonic ha presentato il tablet G3 e il 2-in-1 34. Con Jon Tucker, a capo dell'ingegneria europea, abbiamo parlato di ciò che non si vede: batterie, antenne, porte seriali e accorgimenti nati sul campo
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


Samsung Micro RGB R95H, il primo LCD a LED rossi, verdi e blu di Samsung alla prova del banco di misura Samsung Micro RGB R95H, il primo LCD a LED rossi...
iPhone 18 Pro: la recensione del miglior iPhone compatto di sempre iPhone 18 Pro: la recensione del miglior iPhone ...
Panasonic, 30 anni di Toughbook: la "Bibbia" di mille regole dietro i nuovi G3 e 34 Panasonic, 30 anni di Toughbook: la "Bibbia...
realme C100x, lo smartphone economico con la batteria da 7500 mAh. La recensione realme C100x, lo smartphone economico con la bat...
Star Wars Zero Company è l'erede di XCOM 2 Star Wars Zero Company è l'erede di XCOM ...
Il Dipartimento della Guerra USA pensa a...
SpaceX ha lanciato le missioni Crew-13, ...
DJI Avata 2 in offerta Prime: drone FPV ...
Microsoft vuole far agire l'IA prima anc...
Ginga porta il monitoraggio delle perfor...
Tesla sorprende Wall Street: 486.532 con...
Cosa succede alle ossa degli astronauti ...
AgriEuro Premium Days: il 6 e 7 ottobre ...
259 euro per 2 TB di SSD PCIe 4.0 (Biwin...
GPT-6 Astra decifra dopo 217 anni una le...
Roborock Saros 20 Neo: pulisce al meglio...
Samsung Galaxy S27 Ultra, nuove conferme...
Offerte Prime Candy: lavatrice ProWash 3...
Tegola su Anthropic, gli agenti AI valgo...
E-bike in carbonio con un prezzo assurdo...
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: 20:47.


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