2012-11-23 36 views
5

Chức năng C strerror trả về chuỗi mô tả lỗi, như chi tiết here. Ví dụ:chuỗi mô tả strerror

 
No such file or directory 

Câu hỏi đặt ra ở đâu? Tôi đã xem qua các tệp tiêu đề của mình và không thấy gì cả.

Trả lời

5

Chúng được định nghĩa ở đâu đó trong thư viện C, theo truyền thống trong một mảng toàn cầu là char* được gọi là sys_errlist có chiều dài sys_nerr, ít nhất là trên các hệ thống Unix.

Bởi vì chương trình di sản, văn bản trước khi strerror được tiêu chuẩn hóa, có thể truy cập vào mảng này trực tiếp, nó vẫn còn có sẵn ngay cả trên hiện đại GNU/Linux và Mac OS X cho khả năng tương thích ngược (mặc dù bạn thực sự không nên truy cập vào nó trừ qua perror hoặc strerror).

Ví dụ: đây là Mac OS X 10.8.2 definition of sys_errlist.

2

Chúng thường có khả năng được xác định và được nhúng trong thư viện thời gian chạy C của bạn, ví dụ: libc trên hầu hết các hệ thống như Unix.

2

Ít nhất trong thư viện điển hình, chúng sẽ nằm trong tệp đối tượng được liên kết - thường là strerror.o (hoặc .obj, v.v.). Một chút grepping thông qua các mã nguồn vào thư viện nên biến chúng lên, nếu bạn quan tâm đủ để xem xét.

4

File header chứa các thông báo lỗi được đặt tên 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 }; 

Như bạn có thể thấy nó phụ thuộc vào việc thực hiện libc. nhưng ý tưởng chung là giống nhau: một số mảng chứa ánh xạ từ một số lỗi đến độ dài tối đa chuỗi là 1024 byte.

hiện thực khác:

+0

off-topic .. cách phức tạp là việc thực hiện liên kết thứ hai. – Jack

+1

@jack rất nhiều +10000 – 0x90

+1

Ngoại trừ liên kết cuối cùng, tất cả thông tin của bạn dường như đến từ các dự án OS của sinh viên. –