Saat menelepon execl(...)
, saya mendapat errno=2
. Apa artinya? Bagaimana saya bisa tahu artinya ini errno
?
221
Anda dapat menggunakan strerror()
untuk mendapatkan string yang dapat dibaca manusia untuk nomor kesalahan. Ini adalah string yang sama yang dicetak oleh perror()
tetapi berguna jika Anda memformat pesan kesalahan untuk sesuatu selain output kesalahan standar.
Sebagai contoh:
#include <errno.h>
#include <string.h>
/* ... */
if(read(fd, buf, 1)==-1) {
printf("Oh dear, something went wrong with read()! %s\n", strerror(errno));
}
Linux juga mendukung varian eksplisit-threadsafe strerror_r()
.
strerror()
tidak aman saatstrerror_r()
thread aman. Fungsi MT-Safe atau Thread-Safe aman untuk dipanggil di hadapan utas lainnya. MT, dalam MT-Safe, singkatan dari Multi Thread. -p26, Pustaka GNU Cchar * strerror(int errnum )
[Fungsi] Pendahuluan: | Balapan MT-Tidak Aman: strerror | Tumpukan AS-Tidak Aman i18n | AC-Tidak Aman mem | Lihat Bagian 1.2.2.1 [Konsep Keselamatan POSIX], halaman 2. -p58, Perpustakaan GNU Cerrno
aman-utas. Lihat:#define errno *__errno_location()
errno
, libc GNUstrerror
menulis ke buffer global internal . Tidak selalu melakukan ini, tetapi dalam beberapa kasus memang demikian. Anda akan menimpa buffer itu saat utas lainnya membacanya.errno
, tidakstrerror()
.Alih-alih berjalan
perror
pada kode kesalahan apa pun yang Anda dapatkan, Anda dapat mengambil daftar lengkaperrno
nilai pada sistem Anda dengan one-liner berikut:cpp -dM /usr/include/errno.h | grep 'define E' | sort -n -k 3
sumber
Di Linux ada juga alat yang sangat rapi yang dapat langsung mengetahui apa arti setiap kode kesalahan. Pada Ubuntu:
apt-get install errno
.Kemudian jika misalnya Anda ingin mendapatkan deskripsi kesalahan tipe 2, ketikkan saja
errno 2
di terminal.Dengan
errno -l
Anda mendapatkan daftar dengan semua kesalahan dan deskripsinya. Jauh lebih mudah daripada metode lain yang disebutkan oleh poster sebelumnya.sumber
perror
/strerror
lebih baik karena PENGGUNA tidak perlu mencarinya. Meskipun,errno -l
lebih baik untuk menemukannya.Berikut ini adalah output dari
errno -l
diformat ulang untuk dibaca:Saya menggunakan tabularise di Vim untuk meluruskan kolom:
sumber
Kode kesalahan 2 berarti "File / Direktori tidak ditemukan". Secara umum, Anda bisa menggunakan fungsi perror untuk mencetak string yang dapat dibaca manusia.
sumber
Ada beberapa fungsi yang berguna untuk menangani
errno
s. (Hanya untuk memperjelas, ini adalah bawaan untuklibc
- Saya hanya memberikan contoh implementasi karena beberapa orang menemukan membaca kode lebih jelas daripada membaca bahasa Inggris.)strerror
mengembalikan string yang menggambarkan nomor kesalahan yang Anda berikan. Perhatian, ini bukan thread-atau interrupt-safe; bebas menulis ulang string dan mengembalikan pointer yang sama pada doa berikutnya. Gunakanstrerror_r
jika Anda perlu khawatir tentang itu.perror
mencetak pesan yang Anda berikan, ditambah string yang menggambarkan saat inierrno
, ke kesalahan standar.sumber
some people find reading code clearer than reading English
kebenaran.Ini lebih cepat daripada mencari kode
errno.h
, lebih pendek dari sebagian besar solusi yang diposting di sini dan tidak memerlukan instalasi alat pihak ketiga:perl -E 'say $!=shift' 2
hasil panen
No such file or directory
sumber
-E
memperlakukan kode yang dikutip berikut ini sebagai skrip Perl.say
sedang menulis argumennya ke output standar.$!
adalah variabel khusus yang memegang nilaierrno
. Jika digunakan dalam konteks string menghasilkan string kesalahan yang sesuai. Script memberikan nilai2
ke variabel ini dengan menggunakanshift
perintah, yang memotong kepala array argumen@ARGV
dan menempatkan kepala ini di tempatnya. Baris perintah juga bisa ditulis sebagaiperl -E 'say $!=2'
.Bekerja pada Solaris.
cc perror.c -o perror
<< gunakan baris ini untuk mengkompilasinyasumber
perror(NULL);
? Denganperror("");
format itu: ERROR NAME
. Denganperror(NULL);
outputnya sajaERROR NAME
Ini dokumentasinya . Itu akan memberi tahu Anda apa artinya dan apa yang harus dilakukan dengan mereka. Anda harus menghindari menggunakan nilai numerik dan menggunakan konstanta yang tercantum di sana juga, karena jumlahnya dapat berubah di antara sistem yang berbeda.
sumber
errnoname
perpustakaan saya saat itu. Ini mengurus bagian yang membosankan mengumpulkan semua nama errno yang mungkin menjadi fungsi C yang dapat digunakan hanya sepele untuk mendapatkan nama makro errno dari nomor tersebut. Menggunakannya sebagai basis, membuatperror
varian Anda harus cepat dan mudah.Saya menggunakan skrip berikut:
sumber
Ketik
sudo apt-get install moreutils
dan kemudian setelah yang diinstal, ketikerrno 2
. Anda juga dapat menggunakanerrno -l
untuk semua nomor kesalahan, atau hanya melihat orang-orang file dengan pipa kegrep
, seperti ini:errno | grep file
.sumber
Panggilan
dalam hal terjadi kesalahan.
Sampel:
Halaman dari
errno(3)
danperror(3)
menarik, juga ...sumber
Ketika Anda menggunakan strace (di Linux) untuk menjalankan biner Anda, itu akan menampilkan pengembalian dari panggilan sistem dan apa artinya nomor kesalahan. Ini terkadang bermanfaat bagi Anda.
sumber
Saya memiliki fungsi berikut dalam file .bashrc saya - itu mendongak nilai errno dari file header (dapat berupa
/usr/include/errno.h
,/usr/include/linux/errno.h
, dll, dll)Ini berfungsi jika file header diinstal pada mesin ;-)
Biasanya file header memiliki kesalahan + selanjutnya muncul penjelasan dalam komentar; sesuatu dari yang berikut:
./asm-generic/errno-base.h:#define EAGAIN 11 / * Coba lagi * /
sumber
Itu berarti:
sumber