|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Controllare se un fd e' valido
Domanda idiota
![]() Edit: ovviamente ( ![]() ![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
non è un (int??)
|
![]() |
![]() |
![]() |
#3 |
Bannato
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); } Spero di essermi chiarito meglio ora |
![]() |
![]() |
![]() |
#4 |
Senior Member
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 |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
E ferror ?
|
![]() |
![]() |
![]() |
#6 | |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Quote:
![]() Grazie. |
|
![]() |
![]() |
![]() |
#7 |
Bannato
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 ![]() |
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
![]()
__________________
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 |
|
![]() |
![]() |
![]() |
#9 | ||
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
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:
![]() 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!!
__________________
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 |
||
![]() |
![]() |
![]() |
#10 |
Bannato
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). |
![]() |
![]() |
![]() |
#11 |
Bannato
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). |
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
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 |
|
![]() |
![]() |
![]() |
#13 |
Bannato
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); Una cosa cosi' 'palese' suppongo implichi che c'e' un modo per capire se stdin ti e' stato chiuso... ma quale ? ![]() |
![]() |
![]() |
![]() |
#14 |
Senior Member
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 |
![]() |
![]() |
![]() |
#15 |
Senior Member
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 ?
|
![]() |
![]() |
![]() |
#16 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
![]() 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 |
|
![]() |
![]() |
![]() |
#17 |
Senior Member
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 |
![]() |
![]() |
![]() |
#18 |
Bannato
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
![]() ![]() |
![]() |
![]() |
![]() |
#19 |
Bannato
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 ![]() |
![]() |
![]() |
![]() |
#20 |
Senior Member
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 |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:57.