GNU/Linux >> Belajar Linux >  >> Linux

Nilai rentang errno yang ditentukan pengguna (khusus POSIX atau Linux)

errno sebenarnya nilai tidak ditentukan oleh standar C dan C++. Jadi tidak ada cara untuk mengembalikan bilangan bulat (positif) tertentu dan menjaminnya agar tidak berbenturan dengan bilangan bulat yang digunakan implementasi. Standar C hanya memerlukan tiga marco:

Draf C11, 7.5 Kesalahan

Makro adalah

EDOM
EILSEQ
ERANG

yang diperluas ke ekspresi konstanta bilangan bulat dengan tipe int, nilai positif berbeda, dan cocok untuk digunakan dalam #if preprocessingdirectives;

Jadi Anda tidak tahu apa errno lainnya nilai didefinisikan dalam implementasi Anda.

errno nilai adalah bilangan bulat postif dalam standar C dan POSIX. Jadi Anda bisa menggunakan pencacahan Anda sendiri dengan nilai negatif untuk menentukan nomor kesalahan Anda sendiri. Tetapi Anda tidak dapat menggunakan antarmuka strerror/perror. Jadi, Anda mungkin memerlukan pembungkus tambahan untuk strerror/perror untuk menginterpretasikan nomor kesalahan Anda sendiri.

Sesuatu seperti:

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);
}

dan yang serupa untuk perror .

Catatan Anda juga harus mengatur errno ke 0 sebelum memanggil "sumber daya terbuka" Anda untuk memastikan errno memang diatur oleh fungsi Anda.

Saya akan menghindari errno standar sama sekali dalam situasi seperti ini dan menentukan pencacahan saya sendiri untuk kesalahan. Anda dapat melakukannya jika "sumber daya terbuka" Anda tidak terlalu rumit dan mengembalikan terlalu banyak kemungkinan kode kesalahan.


Linux
  1. Batasi Posix Temukan Ke Kedalaman Tertentu?

  2. Periksa Apakah $reply Berada Dalam Rentang Angka?

  3. Apa yang dimaksud dengan POSIX?

  1. Utas POSIX terpisah vs. Dapat digabungkan

  2. Cetak errno sebagai mnemonik?

  3. Pindahkan berbagai file bernomor?

  1. Apa Sebenarnya Posix?

  2. Jalankan Perintah Pada Rentang Direktori yang Ditentukan?

  3. Deskripsi nilai kernel.printk