2009-07-12 12 views
7

Nel libro "Il linguaggio di programmazione C", si legge:..Dove posso vedere l'elenco delle funzioni che interagiscono con errno?

"Molte delle funzioni degli indicatori di stato set di libreria quando l'errore o la fine del file si verificano queste indicatori possono essere impostati e testati in modo esplicito In Inoltre, l'espressione intera errno (dichiarata in <errno.h>) potrebbe contenere un numero di errore che fornisce ulteriori informazioni sul più recente errore . "

Dove posso visualizzare un elenco di queste funzioni?

+0

@Leif, bello che stai lavorando con K & R. Ho appena finito di fare lo stesso per un paio di giorni durante le mie vacanze. (-: –

risposta

6

La norma dice questo circa errno:

Il valore di errno è zero all'avvio del programma, ma non è mai impostato a zero da qualsiasi funzione di libreria . Il valore di errno può essere impostato su un valore diverso da zero mediante una chiamata di funzione della libreria, indipendentemente dal fatto che vi sia o meno un errore, a condizione che l'uso di errno non sia documentato nella descrizione della funzione in questo standard internazionale.

Il che mi dice che ogni funzione di libreria può avvitare in giro con errno in alcun modo che vuole, tranne:

  • non può impostare errno-0
  • non può fare quello che Mi piace se lo standard dice esplicitamente altrimenti

Si noti che lo standard suggerisce quanto segue in una nota a piè di pagina:

Pertanto, un programma che utilizza errno per il controllo degli errori deve impostarlo su zero prima di una chiamata di funzione di libreria, quindi ispezionarlo prima di una successiva chiamata di funzione di libreria. Ovviamente, una funzione di libreria può salvare il valore di errno in ingresso e quindi impostarlo su zero, purché il valore originale venga ripristinato se il valore di errno è ancora zero appena prima del ritorno.

Come indicato in altre risposte, è comune anche per le funzioni che non sono nello standard impostare errno.

5

Si deve presupporre che qualsiasi funzione possa impostare errno, non solo quelli nella libreria standard. Una lista sarebbe quindi un po 'inutile.

+0

Non sono d'accordo, anche se la vita sarebbe sicuramente più facile a modo tuo! Attualmente sto lottando con alcune librerie incorporate che restituiscono messaggi del tipo "Si è verificato un errore: errno = 0" Quindi, come l'OP indica, se perdonerai irresistibile gioco di parole sul tuo nome, sarebbe utile essere in grado di filtrare quelle funzioni che non impostano errno a valori utili –

+1

@Adam Che gioco di parole sarebbe? Presumo mi manca qualcosa di ovvio e maleducato? –

+0

La domanda non riguardava alcuna funzione, si trattava di quelle della libreria standard, ma lo standard documenta le funzioni nella libreria che modificano errno, il che è inutile se si tratta di funzioni garantite per non modificare errno come se lo fossero. – Dingo

0

Una domanda corretta potrebbe essere quali valori possono ottenere errno e che cosa significano ciascuno di essi. Puoi vederli elencati in intro(2).

-1

È possibile utilizzare l'editor preferito e "Trova nei file ..." per cercare file contenenti la parola chiave errno.

+0

E i caratteri in grassetto occupano più spazio su disco? –

+0

Non ti capisco. significato per cercare i file della libreria (* .c, * .cpp). –

1

Quasi tutte le funzioni di libreria posix possono impostare errno se si verifica un errore, ovvero quando la funzione restituisce -1. Un'eccezione sono le funzioni di threading perché impostare una variabile di errore globale da più thread sarebbe molto pericolosa. Restituiscono 0 in caso di successo, altrimenti il ​​codice di errore (questo codice è compatibile con errno in modo da poter utilizzare le funzioni strerror e perror su di esso).

+0

Esiste davvero un'implementazione POSIX con thread ma non ha un errore locale del thread? – bk1e

+0

"errno' è specificato per essere specifico del thread. per informazioni errate su questo argomento: –

+0

Non ho mai detto che errno non è specifico per il thread. Le funzioni di threading non impostano comunque errno. – codymanix

1

@Adam, come ha detto Neil, qualsiasi funzione può essere compilata contro errno.h e impostare errno. È per definizione impossibile elencare tutte le utility che sono state compilate in questo modo per utilizzare la funzionalità di base di errno.

Detto questo, ci sono diversi modi in cui gli errori possono essere riportati a un utente. Usare errno è solo uno.

Problemi correlati