Newsgroup: it.comp.programmare
Titolo: [c++ sotto windows] perchè la open() genera comportamenti diversi?

Ho un codice tipo questo:
int fdld = open("d:\\file.txt", O_RDONLY | O_BINARY);
if (fdld == -1)
{
//lo gestisco
}
 
bene: se l'unità "D:" non esiste o se è un lettore cd/dvd senza dentro il disco, il comportamento non è sempre uguale su tutti i pc!!
Nella maggior parte dei casi la open ritorna -1 e quindi va tutto bene, mentre in alcuni rari casi il sistema operativo genera una dialog in cui avverte dell'assenza del disco e quindi propone i 3 pulsanti "continue" "retry" "cancel".
In quest'ultimo caso l'esecuzione dell'applicazione rimane bloccata sulla open().
 
Vorrei capire cosa genera questa differenza di comportamento, considerando che spesso i pc con comportamenti differenti hanno lo stesso windows (di sicuro succede sotto xp) e con Service Pack 3.
Altri dattagli circa l'aggiornamento non ne ho.
 
Io penso che sia una questione di aggiornamento di windows, ma vorrei avere delle certezze anzichè andare a caccia di speranze.
 
Qualunque consiglio è ben accetto.


 
Anticipo che non ne ho idea, ma vedere la "open()" in un programma win32 e
sentire che non funziona non mi pare molto strano :)
 
Io personalmente farei il check di esistenza usando un'API win32 (tipo boh,
FindFirstFile(), ad esempio) e poi l'apertura (con OpenFile()): sicuramente
di quelle la (retro)compatibilità è garantita.
 
M2C,
Ciao!

 
 
Infatti neanche a me piace usare le API win così, pure, nel codice. Però boh,
dipende dall'OP e dal suo caso, magari se usandole gli funziona tutto le
mette sotto #ifdef e pace.
 
Ciao!

 In quest'ultimo caso l'esecuzione dell'applicazione rimane bloccata sulla open().
 
Per forza. Nel caso del CD/DVD, il SO testa se c'� un disco, poi testa 
se � formattato o comunque se c'� qualcosa di leggibile. Se  (come 
capita a volte) il disco c'� ed � formattato ma il drive fa fatica a 
leggerlo, il SO prova, riprova e poi chiede all'utente cosa vuole fare.
 
La tua open rimane in attesa finch� non accade una di queste 3 cose:
1) finalmente il drive legge qualcosa.
2) il drive d� un errore come Dio comanda (file not found o che altro)
3) l'utente abortisce la lettura.
 
Occhio che su winXP e precedenti l'I/O abort � un'operazione pericolosa 
e pu� incasinare il sistema: pu� succedere che la open() resti appesa lo 
stesso. Se vuoi andare sul sicuro usa un thread a parte per l'I/O, cos� 
il programma non resta bloccato e puoi prendere provvedimenti se la tua 
open() s'impalla.
 
E comunque non ti fidare mai che il valore ritornato da open() sia 
sempre -1: testa se � minore di zero e in questo caso fai stampare, 
sullo stderr o sul log, strerror(errno) per sapere cosa � successo di 
preciso.
 

 
 
:O
Cioè per fare le cose "sicure" bisognerebbe mettere tutto l'IO in un thread?
Minchia, non son per nulla dispiaciuto di aver programmato "poco" su win...
 
Ciao!

 di quelle la (retro)compatibilità è garantita.
 
Temo che il semplice tentativo di accesso x vedere se esiste un file   causi comunque l'apparizione di quella dialog.
 
Andrea

 - è la open() di una libreria esterna, tipo usando cygwin o simili
 
Uso il compilatore di MS.

 open() s'impalla.
 
Il punto è che non deve apparire la dialog e non ci devono essere latenze.
La ricerca di un dato file su un *POSSIBILE* disco D: è una cosuccia quasi segreta. Deve essere invisibile.
E funziona. Quasi sempre, salvo queste eccezioni.
 
Andrea

La fregatura quindi è che non posso semplicemente usare un'API per testare l'esistenza di un'unità D: prima di fare altre operazioni, perchè l'unità molto probabilmente esiste. Solo che il dvd non è dentro.
Quindi qualunque operazione su quella unità  mi farebbe potenzialmente apparire quella scocciatura.


La butto lì: GetFileAttributes() su "D:\" ?
Se c'è qualcosa lo scopri subito, altrimenti non chiede nulla e ritorna vuoto ;)
 
Ciao!

 
 
e cercando quella funzione su google ho trovato anche questo, magari ti può
essere utile...
http://stackoverflow.com/questions/4072353/how-to-determine-if-a-cd-is-in-cd-rom-drive
 
 
Ciao!

Tutto molto interessante. Con calma farò delle prove pratiche.
Ti ringrazio.
Ringrazio cmq tutti per l'interessamento.