Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere?
Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere?
HONOR Magic V6 è arrivato in Italia a 2.299,90 euro con una promessa precisa: unire 4 mm di spessore da aperto (8,75 mm chiuso nel modello White, 9 mm negli altri colori) a una batteria da 6.660 mAh, la più capiente mai vista su un pieghevole. Lo abbiamo usato per oltre una settimana in versione Red 16/512 GB per capire se lo Snapdragon 8 Elite Gen 5 tiene testa alla concorrenza anche fuori dai benchmark ufficiali
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7 punta su un display ampio e fluido, una batteria capace di accompagnare l'uso quotidiano senza ansie da ricarica e un prezzo accessibile, a partire da 179,90 euro per la versione con 64 GB di storage. Lo Snapdragon 6s 4G Gen 2 e i 4 GB di RAM della configurazione più diffusa frenano però chi cerca reattività e multitasking spinto: ecco il bilancio dopo due settimane di prova diretta
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Polygon è la concept car di Peugeot che mostra il futuro delle soluzioni del segmento B: tra design compatti e innovativi affiancati da dimensioni compatte uno scherzo dalla manovrabilità incredibile per le manovre a bassa velocità
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 23-05-2003, 17:31   #1
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
Controllare se un fd e' valido

Domanda idiota : come controllo sotto unix se un file descriptor e' valido ?

Edit: ovviamente ( ) fd sta per file descriptor e il linguaggio e' il C
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2003, 19:37   #2
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
non è un (int??)
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2003, 20:04   #3
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
Si', ma io voglio sapere se quell'intero si riferisce effettivamente ad un fd oppure e' solo... un intero !
A me in particolare interessa stdin (fd 0)
Ad esempio nel seguente pezzo di codice (non scritto da me) il programma vuole chiudere stdin per i suoi motivi. Il problema e' che quando lo chiamo dal window manager (fvwm) stdin viene chiuso da questi e quindi quando il programma cerca di chiuderlo (e dirottare tutto su /dev/null) il programma si pianta.

Codice:
/* codice originale */
/* ... */
int fd;
fd = open("/dev/null", O_RDONLY);
if (fd > 0)
{
	close(0);
	dup2(fd, 0);
	close(fd);
}
Se le funzioni si limitassero a ritornare un errore potrei semplicemente controllare il valore di ritorno di close ed in caso evitare la chiamata a dup2. Purtroppo pero' invece il programma si pianta col messaggio "Fatal IO error 9 (bad file descriptor)".

Spero di essermi chiarito meglio ora
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 24-05-2003, 19:20   #4
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
fstat

Nota che "if (fd>0)" è br0ken, in quanto se stdin è "chiuso" il sistema operativo è liberissimo di allocare il valore 0 per un descrittore.
__________________
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 24-05-2003, 20:19   #5
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
E ferror ?
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 25-05-2003, 14:26   #6
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
Quote:
Originally posted by "ilsensine"

fstat

Nota che "if (fd>0)" è br0ken, in quanto se stdin è "chiuso" il sistema operativo è liberissimo di allocare il valore 0 per un descrittore.
Avevo provato ma non mi sembrava che la situazione si sistemasse. Forse era dovuto proprio al cotnrollo bacato. Purtroppo non sono pratico di queste cose. Cmq intanto ho segnalato il bug. Se poi riesco a sistemare qualcosa... (poca fiducia... ma vediamo un po' )

Grazie.
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 25-05-2003, 15:15   #7
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
ho trovato isatty(), forse e' anche meglio (visto che fa proprio il controllo che desidero)...

edit: forse no, sembra serva ad un'altra cosa
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 25-05-2003, 16:39   #8
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originally posted by "cionci"

E ferror ?
ferror restituisce la condizione di errore di un _valido_ FILE *. Per passare da fd->FILE * occorre usare fdopen, che però fallisce se l'fd non è valido
__________________
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 25-05-2003, 16:47   #9
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originally posted by "/\/\@®¢Ø"


Avevo provato ma non mi sembrava che la situazione si sistemasse.
Codice:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <stdio.h>
int main() {
struct stat buf;
int ret;
ret = fstat(0, &buf);
fprintf(stderr, "stdin aperto: fstat ritorna %d\n", ret);
close(0);
ret = fstat(0, &buf);
fprintf(stderr, "stdin chiuso: fstat ritorna %d (%s)\n", ret, strerror(errno));
return 0;
}
Quote:
Cmq intanto ho segnalato il bug.
Io mi riferivo in generale. In quel caso il bug è _non_ controllare se la open fallisce; questo codice ad es. funziona (perché? )
Codice:
int fd;
fd = open("/dev/null", O_RDONLY);
if(fd<0) {
/* gestisci l'errore... */ 
} else if (fd>0) {
   close(0);
   dup2(fd, 0);
   close(fd);
} // ...else è perfettamente ok!!
Nota che close(0) è superflua (v. man dup2)
__________________
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 25-05-2003, 17:11   #10
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
[quote="ilsensine"]
Io mi riferivo in generale. In quel caso il bug è _non_ controllare se la open fallisce; questo codice ad es. funziona (perché? )
[quote]
Io in realta' pensavo che col check >0 si considerassero alla stessa stregua il caso -1 e 0. (Nel primo caso ignorando l'errore, nel secondo proseguendo perche' abbiamo gia' fd==0 e quindi non occorre duplicarlo su se stesso).
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 25-05-2003, 17:15   #11
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
aspetta che forse ho capito...
visto che stdin mi e' stato chiuso dal chiamante (il window-manager), e' possibile che in 0 ci sia comunque un fd validissimo ma non sia stdin, e quindi non mi basta controllare se 0 e' un fd valido ! Allora in questo caso come faccio a capire che non si tratta di stdin ? (da quel che ho capito il wm lo fa apposta per farmi capire che sto operando in modalita' non interattiva).
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 25-05-2003, 18:59   #12
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originally posted by "/\/\@®¢Ø"

aspetta che forse ho capito...
visto che stdin mi e' stato chiuso dal chiamante (il window-manager), e' possibile che in 0 ci sia comunque un fd validissimo ma non sia stdin, e quindi non mi basta controllare se 0 e' un fd valido ! Allora in questo caso come faccio a capire che non si tratta di stdin ? (da quel che ho capito il wm lo fa apposta per farmi capire che sto operando in modalita' non interattiva).
Un programma che confida che stdin è sull'fd 0 è mal scritto. Occorrerebbe usare, semmai, fileno(stdin) - che fallisce solo se stdin è chiuso.
Cmq non sapevo che il wm "chiude" stdin, sei sicuro di questo?
__________________
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 25-05-2003, 19:08   #13
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
Quell'errore lo avevo notato anche io, pero' non era tra quelli che rompevano (penso) e quindi l'ho lasciato li'.
Penso proprio di si' che sia il window-manager, nei sorgenti ho trovato pure questo:
Codice:
		/* close stdin so the exec'd process knows its not
		   interactive */
	  	close(STDIN_FILENO);
(il wm e' Fvwm)
Una cosa cosi' 'palese' suppongo implichi che c'e' un modo per capire se stdin ti e' stato chiuso... ma quale ?
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 25-05-2003, 20:48   #14
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Credo che stdin sia "hardcoded" sull'fd 0, quindi fstat fatto su 0 è la "soluzione" più generale...
Un pò più "complicato" capire se l'fd 0 corrisponde a stdin o a qualche file aperto dopo la chiusura di stdin, per far questo forse aiuta l'esame della struct stat riempita da fstat
__________________
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 26-05-2003, 08:21   #15
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Ma la fstat riporta qualche device particolare per lo stdin ?
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 26-05-2003, 11:07   #16
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originally posted by "cionci"

Ma la fstat riporta qualche device particolare per lo stdin ?
Dipende cosa è "stdin". Può essere un file (programma < file.txt), un pipe (cat file.txt|programma), un pts (programma eseguito "senza parametri"; stdin riporta l'input da tastiera). In quest'ultimo caso ad esempio, "stdin" è in effetti /dev/stdin, che è un link a /dev/fd/0, che è a sua volta un link a /dev/pts/n dove n è il pseudoterminal slave corrente; in questo caso S_ISCHR() è true, e struct stat::st_rdev indica il device caratteri utilizzato... chiaro?
In tutti i casi, fstat riporta chiaramente "cosa sto usando" come stdin, oppure un errore se stdin è "chiuso".
__________________
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 26-05-2003, 11:16   #17
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
/\/\@®¢Ø, posso sapere cosa stai tentando di fare? Un programma che "preleva" stdin da /dev/null presumo che non debba MAI leggere da stdin...
__________________
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 26-05-2003, 11:24   #18
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
Solo un problema che avevo trovato utilizzando rox-filer sotto Fvwm: quando chiamo da menu Fvwm chiude l'stdin perche' alcuni programmi cercano di capire se stanno lavorando in modalita' interattiva o meno ( gmplayer ad esempio) mentre poi rox-filer cerca di dirottare stdin su /dev/null per un motivo analogo. Volevo vedere se riuscivo a capire quale era il problema, ma avendo pure segnalato la cosa su entrambe le mailing lists me l'hanno appena risolto (ovvero quelli di fvwm hanno cambiato la close nel dup2 come rox).
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 26-05-2003, 11:26   #19
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
La cosa bizzarra comunque era che la dup2 funzionava in ogni caso... solo che se stdin era stato precedentemente chiuso il programma andava in errore. Eliminando la dup2 invece il programma funzionava in ogni caso.


grazie mille comunque
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 26-05-2003, 11:32   #20
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Mah continuo a non capire dove era il problema...questo codice funziona in ogni caso, sia che stdin sia aperto o chiuso, purché fd sia DIVERSO da 0 e che su 0 non ci sia un fd aperto per altri scopi:

dup2(fd, 0);
close(fd);
__________________
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
 Rispondi


Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere? Recensione HONOR Magic V6: spessore record e sup...
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni Redmi Pad 2 9.7: ampio display, economico e peso...
Peugeot Polygon Concept: ecco il futuro delle utilitarie Peugeot Polygon Concept: ecco il futuro delle ut...
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione Reno16 Pro: il compatto di OPPO punta su fotocam...
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco Hisense 55U7SE: tuttofare e accessibile, il Min...
HP blocca anche le cartucce di inchiostr...
Acquisizione Apple: SigScalr chiude, gli...
Cooler Master HAF II 500 integra le vent...
I musulmani non dovrebbero usare le crip...
AMD Radeon 9000 pronte a sorpassare le N...
Soulframe, il nuovo gameplay chiarisce m...
La Commissione UE presenterà una ...
Niente più eliche: con due ali, i...
Waze si aggiorna con nuove funzioni IA: ...
Oltre 200 economisti ed esperti di IA la...
I migliori produttori del 2026? Facci sa...
Claude Code consuma fino a 33 mila token...
Si chiama Starfire il chip con cui Intel...
Chrome espone l'OS reale dietro ogni ric...
Intel investe altri 5 miliardi di euro p...
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: 18:39.


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