2012-11-23 15 views
5

ayrıntılı here gibi bir hata açıklaması dize döndürür strerror C fonksiyonu. Örnek dizestrerror açıklama dizeleri

 
No such file or directory 

Bu dizeler nerede tanımlanmış sorudur? Başlık dosyalarına baktım ve hiçbir şey görmedim.

cevap

5

C kütüphanesinde, geleneksel olarak, sys_errlistsys_nerr adı verilen küresel bir dizide, en azından Unix sistemlerinde tanımlanmıştır. strerror önce yazılmış eski programların, standardize edilmiş Çünkü

, gerçekten perror veya strerror içi haricinde erişmek olmamalıdır olsa (hatta geriye dönük uyumluluk için, modern, GNU/Linux ve Mac OS X hâlâ sunuluyor, doğrudan bu diziyi erişebilir).

Örn, burada Mac OS X 10.8.2 definition of sys_errlist bu. Eğer libc uygulanmasına bağlıdır görebileceğiniz gibi

2

Genellikle olasılıkla tanımlanmış ve C Çalışma Zamanı Kitaplığı, örneğin gömülü çoğu unix benzeri sistemlerde libc.

2

En azından tipik bir kitaplık içinde, genellikle strerror.o (veya .obj, vb.) Bağlanan bir nesne dosyasında olurlar. Bakmak için yeterince dikkatli olursanız, kaynak kodun kütüphaneye kaydırılması, onları çevirmelidir.

4

hata iletileri içeren başlık dosyası errmsg.h

00012 const char *const sys_errlist[] = { 
00013   "Operation succeeded",  /* 0 */ 
00014   "Invalid argument",   /* EINVAL */ 
00015   "Bad memory address",   /* EFAULT */ 
00016   "String too long",   /* ENAMETOOLONG */ 
00017   "Out of memory",    /* ENOMEM */ 
00018   "Input/output error",   /* EIO */ 
00019   "No such file or directory", /* ENOENT */ 
00020   "Not a directory",   /* ENOTDIR */ 
00021   "Is a directory",    /* EISDIR */ 
00022   "File or object exists",  /* EEXIST */ 
00023   "Cross-device link",   /* EXDEV */ 
00024   "Try again later",   /* EAGAIN */ 
00025   "Illegal seek",    /* ESPIPE */ 
00026   "Unimplemented feature",  /* EUNIMP */ 
00027   "Device not available",  /* ENXIO */ 
00028   "No such device",    /* ENODEV */ 
00029   "Device or resource busy", /* EBUSY */ 
00030   "Invalid/inappropriate ioctl",/* EIOCTL (ENOTTY in Unix) */ 
00031   "Directory not empty",  /* ENOTEMPTY */ 
00032   "Result too large",   /* ERANGE */ 
00033   "No space left on device", /* ENOSPC */ 
00034   "Too many open files",  /* EMFILE */ 
00035   "Too many open files in system",/* ENFILE */ 
00036   "No such system call",  /* ENOSYS */ 
00037   "File is not executable",  /* ENOEXEC */ 
00038   "Argument list too long",  /* E2BIG */ 
00039   "Bad file number",   /* EBADF */ 
00040 }; 

adlandırılır. Ancak genel fikir aynıdır: bazı dizi, bir hata numarasından 1024 baytlık bir dize uzunluğu uzunluğuna kadar bir eşlemeyi içerir.

diğer uygulamalar:

+0

konu dışı .. İkinci bağlantı uygulanması ne kadar karmaşık. – Jack

+1

@jack alot +10000 – 0x90

+1

Son bağlantı haricinde, tüm bilgilerinizin öğrencilerin işletim sisteminden geldiği görülmektedir. –