GNU/Linux >> Linux Esercitazione >  >> Linux

Valori dell'intervallo errno definiti dall'utente (specifici per POSIX o Linux)

L'attuale errno i valori non sono definiti dagli standard C e C++. Quindi non c'è modo di restituire un particolare numero intero (positivo) e garantire che non entri in conflitto con quello utilizzato da un'implementazione. Lo standard C richiede solo tre marco:

Bozza C11, errori 7.5

Le macro sono

EDOM
EILSEQ
ERANGE

che si espandono in espressioni costanti intere con tipo int, valori distinti positivi e che sono adatte per l'uso nelle direttive di pre-elaborazione #if;

Quindi non sai quale altro errno i valori sono definiti nell'implementazione.

Il errno i valori sono numeri interi postivi nello standard C e POSIX. Quindi potresti usare la tua enumerazione con valori negativi per definire i tuoi numeri di errore. Ma poi non puoi usare le interfacce strerror/perror. Quindi potresti aver bisogno di un wrapper aggiuntivo per strerror/perror per interpretare i tuoi numeri di errore.

Qualcosa come:

enum myErrors{
ERR1 = -1,
ERR2 = -2,
...
ERR64 = -64
};

char *my_strerror(int e)
{
   if (e>=ERR1 && e<=ERR2)
      return decode_myerror(e); // decode_myerror can have a map for  
                                //your error numbers and return string representing 'e'.
   else
      return strerror(e);
}

e uno simile per perror .

Nota che dovresti impostare anche errno a 0 prima di chiamare la tua "risorsa aperta" per assicurarti che il errno è stato effettivamente impostato dalla tua funzione.

Eviterei del tutto l'errno standard in situazioni come questa e definirei la mia enumerazione degli errori. Potresti farlo se la tua "risorsa aperta" non è troppo complicata e restituisce troppi possibili codici di errore.


Linux
  1. Che cos'è esattamente Posix?

  2. Eseguire il comando su un intervallo definito di directory?

  3. Linux:Linux è considerato conforme a Xsi o in gran parte lo è?

  4. Rimuovere i valori duplicati all'interno di un campo?

  5. errno è thread-safe?

Espressione sequenza Bash (intervallo)

Thread POSIX staccati e unibili

ricerca di valori univoci in un file di dati

Stampa errno come mnemonico?

Spostare un intervallo di file numerati?

Descrizione dei valori kernel.printk