Torna indietro   Hardware Upgrade Forum > Software > Programmazione

DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve
Dopo quasi un mese di utilizzo quotidiano e un viaggio medio-lungo in autostrada, raccontiamo pregi e limiti della Geely EX5: comfort premium, batteria LFP da 60,22 kWh, autonomia fino a 430 km e un prezzo che parte da 38.900 €
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


DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
Recensione Google Pixel 11: non ha l'HiLight dei Pro, ma è il Pixel più equilibrato di sempre Recensione Google Pixel 11: non ha l'HiLight dei...
Proxmox annuncia il supporto 24/7 e l'ap...
Esperto smonta le previsioni no-IA con b...
Motorola edge 70 plus, una versione di r...
Lenovo porta l'IA nei PC business: Think...
Lenovo IdeaPad Vibe cambia look: sette c...
Fino a 3,4 GHz per la prossima generazio...
Lenovo lancia i nuovi Yoga AI: due PC co...
Il tuo PC da gaming può aiutare g...
Audio senza cuffie per una persona sola:...
A IFA 2026 Hisense mette l'IA al centro ...
Accusata di favoreggiamento nella strage...
Braccia rubate all'agricoltura: John Dee...
HONOR non si ferma più: arriva anche il ...
Nexus, il mercato nero che ha messo in v...
NVIDIA acquisisce Hugging Face per 12,93...
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: 03:18.


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