GNU/Linux >> Belajar Linux >  >> Linux

Cetak errno sebagai mnemonik?

Bagian kedua dari pertanyaan Anda dijawab oleh strerror (seperti yang Anda tunjukkan), atau lebih baik strerror_r , tetapi di glibc setidaknya Anda cukup menggunakan %m sebagai penentu format.

Bagian pertama lebih menarik, yaitu bagaimana Anda mendapatkan nama konstanta C untuk kesalahan tersebut. Saya yakin tidak ada cara untuk melakukannya dengan menggunakan glibc standar . Anda dapat membuat larik statis atau tabel hash Anda sendiri untuk melakukannya dengan relatif mudah.


Sayangnya tidak; tidak ada dukungan introspeksi untuk E makro kesalahan.

Anda dapat melakukan ini dengan mudah di Python:

import errno
print(errno.errorcode[errno.EPERM])

Ini karena pengelola Python mengalami kesulitan membuat tabel pencarian:http://hg.python.org/cpython/file/tip/Modules/errnomodule.c


Apa masalahnya?

perl -ne 'print "$1\n" if /^#\s*define\s+(E[A-Z0-9]+)/' < /usr/include/sys/errno.h | sort | uniq | perl -ne 'chomp; print "    { $_, \"$_\" }\n"'

Perintah shell unix ini mencetak E* mendefinisikan dari /usr/include/sys/errno.h (di mana aktual mendefinisikan hidup) dalam bentuk { EINVAL, "EINVAL" }, . Anda kemudian dapat membungkusnya menjadi sebuah array:

struct errno_str_t {
    int code;
    const char *str;
} errnos[] = {
    { EINVAL, "EINVAL" },
    ...
};

Dan urutkan berdasarkan nilai errno saat runtime jika diperlukan. Jika Anda ingin portabel (sampai batas tertentu), pertimbangkan untuk menjadikan ini sebagai bagian dari proses pembuatan. Jangan khawatir, itulah cara unix yang sebenarnya untuk melakukan ini :)


Linux
  1. Administrasi Printer

  2. Cetak Dua File Dalam Dua Kolom?

  3. Cetak Semua File Dalam Folder?

  1. Shell Script untuk mencetak piramida Bintang

  2. Contoh Perintah lpr di Linux

  3. lpr:perintah tidak ditemukan

  1. Apakah errno thread-safe?

  2. Bagaimana cara mencetak nomor di perakitan NASM?

  3. Bagaimana cara mencetak pesan ke stderr di Go?