Domanda

Quando vengono creati i socket o vengono aperti/creati file in C, il descrittore di file assegnato al socket/file garantisce che sia il descrittore con il valore più basso disponibile?Cosa dice la specifica C sull'assegnazione dei descrittori di file a questo riguardo, se c'è qualcosa?

È stato utile?

Soluzione

Non è garantito che sia il più basso e dipende dall'implementazione (1).In generale, tuttavia, la routine che assegna i descrittori di file aperti utilizza un metodo che fornisce il primo open on.Potrebbe darsi che subito dopo si liberino diversi valori inferiori, lasciandoti però con un descrittore più elevato di quanto potresti aspettarti.

L'unica ragione per cui mi viene in mente di saperlo, però, è per la funzione di selezione, che viene velocizzata se le passi il descrittore di file più alto che devi controllare.

(1) Si noti che le implementazioni che seguono lo standard IEEE garantiscono il descrittore più basso inutilizzato per i file, ma ciò potrebbe non applicarsi ai socket.Non tutte le implementazioni seguono lo standard IEEE per open(), quindi se stai scrivendo software portabile è meglio non dipendere da esso.

Altri suggerimenti

Non penso che lo troverai nelle specifiche C, più probabilmente nelle specifiche per il tuo sistema operativo.La mia esperienza con Linux è stata che è sempre il più basso.

Risponderò a questa domanda con un'altra domanda: perché è importante?Non dovresti confrontare il descrittore di file con nulla (a meno che non controlli stdin/stdout/stderr) o fare calcoli con esso.Finché si adatta a un int (ed è garantito che lo faccia) è tutto ciò che devi sapere.

Steve M ha ragione;Il C non ha nozione di socket e le sue funzioni di I/O su file utilizzano un oggetto [puntatore a] FILE, non un descrittore.

@aib open(), close(), lseek(), read(), write() fanno tutti uso di descrittori di file.Non utilizzo quasi mai i flussi per l'I/O.

@Kyle è importante a causa di istruzioni come select().Conoscere il descrittore più alto può migliorare le prestazioni.

La specifica C dice che dipende dall'implementazione.Se stai osservando un'implementazione Unix, la pagina man di open(2) dice "Il descrittore di file restituito da una chiamata riuscita sarà il descrittore di file con il numero più basso non attualmente aperto per il processo."

Questo aiuta se stai cercando di allegare un file specifico a un descrittore specifico.Supponiamo che tu voglia reindirizzare stderr a /dev/null.Qualcosa di simile a

chiudi(2);open("/dev/null", O_WRONLY);

dovrei farlo.Dovresti, ovviamente, catturare l'fd restituito da open e assicurarti che sia 2.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top