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 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: 3736
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


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 ...
TP-Link protagonista a IFA 2025 con tant...
TK02 S è la nuova e-enduro di THOK con m...
Fallout 76: Rinnovamento C.A.M.P., pi&ug...
Toyota produrrà auto elettriche in Europ...
HONOR Magic V5 parte bene: lancio da rec...
Dyson svela 11 nuovi prodotti all'IFA: d...
Zurigo si scalda con i rifiuti: le pompe...
Noctua pubblica la nuova roadmap: primo ...
Palo Alto Networks presenta novità...
Surya, il modello di IA di IBM e NASA ch...
I browser Arc e Dia diventano parte dell...
Duster e Bigster, tutto quello che manca...
Superman: Man of Tomorrow, confermato da...
SK Hynix, accordo storico: 10% degli uti...
Arriva Veeam Software Appliance: protezi...
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: 19:50.


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