View Full Version : [C] Errore nel runtime di Visual C++?
a proposito di dup e dup2 il man di Linux riporta tra le altre cose:
Return Value
dup() and dup2() return the new descriptor, or -1 if an error occurred (in which case, errno is set appropriately).
mentre invece MSDN riporta:
Return Value
_dup returns a new file descriptor. _dup2 returns 0 to indicate success.
è la documentazione MSDN a contenere un errore o la Microsoft ha proprio scritto un'implementazione errata di una funzione POSIX?
svelato l'arcano :D
In some cases, Microsoft C++ Runtime library defines a function that has the same name as the POSIX function, prefixed with one or more underscore ('_') characters. For example, _open(), _read(), _write(), and _close(), corresponding to the POSIX.1 functions open(), read(), write(), and close() respectively. Since the names are not portable due to the prefixed underscores, not to mention they may accept different arguments and may have different semantics than defined by the POSIX standard
i nomi in realtà sono portabili: non si è obbligati ad utilizzare "_dup2", esiste anche "dup2" (che è la stessa).
uhm non sono sicuro che dup2 faccia parte dello standard.. ho trovato solo dup per ora, ma aspetto conferme ufficiali :D
ilsensine
09-10-2007, 14:09
Sì sono entrambe posix.
Non è un problema se sotto vc viene ritornato 0 in caso di successo con la dup2, in quanto il valore nel nuovo fd è...noto.
Un veloce
if (dup2(old_fd, new_fd)>=0) {}
è perfettamente portabile tra posix e windows.
questo però non lo è:
if (!dup2(oldfd, newfd)) { /* success */ } else { /* error */ }
funziona su Windows ma non su Linux, ed è codice che uno che ha letto solo MSDN e non la documentazione POSIX potrebbe scrivere. per questo motivo potremmo al massimo dire che è un problema che riguarda più la documentazione che il codice.
ilsensine
09-10-2007, 14:34
questo però non lo è:
if (!dup2(oldfd, newfd)) { /* success */ } else { /* error */ }
funziona su Windows ma non su Linux, ed è codice che uno che ha letto solo MSDN e non la documentazione POSIX potrebbe scrivere. per questo motivo potremmo al massimo dire che è un problema che riguarda più la documentazione che il codice.
certo che non lo è...la dup2 di windows non è 100% posix per via del valore di ritorno, ma la differenza è fortunatamente trattabile con un controllo di negatività senza quindi #ifdef e illegiliora simili.
Anzi ora che ci penso tutte le volte che ho usato la dup2, ho controllato che non ritornasse valori <0...non avevo neanche notato che ritorna l'fd in caso di successo :D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.