2012-04-02 29 views
7

Tôi quan tâm đến hoạt động bên trong của thư viện C chuẩn. Tôi đã tìm thấy một cuốn sách hay về một triển khai có thể - nhưng tôi đang tìm kiếm một giải thích sâu hơn về toàn bộ thư viện chuẩn và các tiêu chuẩn (như POSIX) - định nghĩa của các tiêu chuẩn này trong thư viện chuẩn.Làm việc bên trong của thư viện chuẩn C

Bản nháp C rất hữu ích nhưng không tốt lắm để đọc. Có tài liệu nào khác về chủ đề này không?

  • Standard-Thư viện-PJ-Plauger 1991
  • FreeBSD
  • người
  • C dự thảo
  • GNU (s)

Albertus

+7

Vui lòng mở lại. Đóng đơn phương này là một sự lạm dụng quyền lực của người kiểm duyệt. Tôi tin rằng câu hỏi này là hoàn toàn hợp lý, có thể trả lời ở định dạng SO, và trên thực tế tôi có một câu trả lời mà tôi đã bị chặn từ việc đăng tải bởi quyết định đơn phương bất hạnh để đóng lại. –

+0

@R ..: Đúng vậy, có vẻ như câu hỏi hiện đang mở, gắn thẻ bạn ở đây để bạn nhận được thông báo và thấy rằng câu hỏi đã được mở lại =) – cha0site

+0

@ cha0site: Cảm ơn! –

Trả lời

6

Một điểm khởi đầu tốt sẽ là POSIX. Các POSIX 2008 đặc điểm kỹ thuật có sẵn trực tuyến tại đây:

http://pubs.opengroup.org/onlinepubs/9699919799/

Đó là dễ tiếp cận hơn (nhưng đôi khi ít nghiêm ngặt) so với tiêu chuẩn C, và bao gồm nhiều hơn chỉ là tiêu chuẩn C, tức là hầu hết các linh kiện tiêu chuẩn của Thư viện chuẩn của hệ thống giống Unix.

Nếu bạn quan tâm đến việc triển khai, điều đầu tiên cần lưu ý là hành vi được mô tả POSIX thường được chia nhỏ (vì lý do cần thiết và thực dụng) giữa việc triển khai hạt nhân và triển khai thực hiện libc của không gian người dùng. Một số lượng lớn các hàm trong POSIX (và một vài từ tiêu chuẩn C) sẽ chỉ đơn thuần là các trình bao bọc cho "các cuộc gọi hệ thống", tức là chuyển tiếp vào kernelspace để phục vụ yêu cầu. Trên một số triển khai libc, thậm chí việc tìm kiếm các trình bao bọc này sẽ khó, vì chúng thường được tạo tự động bởi các kịch bản xây dựng và/hoặc hợp nhất thành một tệp ngôn ngữ lắp ráp đơn.

Các chính (số lượng đáng kể của mã phi hạt nhân) hệ thống con của thư viện chuẩn nói chung là:

  • stdio: Trên glibc, điều này được thực hiện bởi GNU libio thư viện, mà là một thực hiện thống nhất của C stdio và C++ iostream, được tối ưu hóa sao cho không bị chậm lại bằng cách là trình bao bọc cho phần còn lại. Đó là một hack lớn và mã khó tìm và theo dõi. Các triển khai khác (đặc biệt là các BSD, mà còn các libcs ​​khác trên Linux) đơn giản và rõ ràng hơn để đọc. Cuối cùng, chúng dựa trên các hàm IO mô tả tập tin cơ bản như open, read, v.v.
  • Chủ đề POSIX: Trên glibc và hiện đại uClibc, đây là NPTL. Tôi không quen thuộc với việc triển khai luồng BSD. Linux libcs ​​khác hoặc thiếu chủ đề hoặc cung cấp triển khai của riêng mình dựa chủ yếu trên Linux clonefutex syscalls.
  • Thư viện toán học: cuối cùng, hầu như tất cả đều dựa trên mã toán học Sun cũ từ đầu những năm 90, nhưng chúng đã phân kỳ rất nhiều. Fdlibm là một xấp xỉ cơ sở khá tốt của mã được sử dụng trong libcs ​​hiện đại.
  • Người dùng, nhóm, tên máy chủ (DNS), vv tra cứu: Điều này được xử lý thông qua libnss trong glibc và trực tiếp trong hầu hết các libcs ​​khác.
  • thường xuyên biểu hiện và glob phù hợp với
  • Thời gian và xử lý
  • Locale và chuyển đổi charset
  • Malloc

Nếu bạn muốn bắt đầu đọc các nguồn múi giờ, tôi khuyên bạn không bắt đầu với glibc. Nó rất lớn và khó sử dụng. Nếu bạn muốn đọc glibc, hãy lưu ý rằng rất nhiều mã đang ẩn dưới cây sysdeps và được tổ chức dựa trên sự đa dạng của các hệ thống mà nó có thể áp dụng. Dietlibc là khá dễ đọc, nhưng nếu bạn đọc nguồn của nó, hãy lưu ý rằng nó có đầy đủ các lỗi lập trình C phổ biến (ví dụ: sử dụng int trong đó size_t là cần thiết, không kiểm tra tràn, v.v ...). Nếu bạn giữ điều này trong tâm trí, nó có thể không phải là một lựa chọn tồi, vì bỏ qua rất nhiều lỗi có thể có/thất bại có xu hướng làm cho mã rất đơn giản. Với điều đó nói rằng, để đọc nguồn libc, tôi sẽ khuyên bạn nên hoặc là một trong những BSD hoặc musl (từ chối trách nhiệm: Tôi là tác giả chính của musl vì vậy tôi là một chút thiên vị ở đây). BSD cũng có lợi thế là mã kernelspace cũng cực kỳ đơn giản và dễ đọc, vì vậy nếu bạn muốn đọc mã hạt nhân ở phía bên kia của cuộc gọi hệ thống, bạn cũng có thể làm điều đó.

+0

Hi Cảm ơn bạn đã trả lời thú vị này (và bỏ chặn). Sau khi đọc một chút từ đặc tả POSIX tôi nhận thấy, tài liệu này dễ đọc hơn nhiều so với tiêu chuẩn C, vì nó tập trung vào định nghĩa chuẩn. Đối với tôi, trang nguồn/tài liệu BSD và dự án thư viện musl là hai điểm khởi đầu tốt. Syscall-backend từ các thư viện này cũng rất thú vị. Albertus – swaechter

+0

_hiển thị hợp lệ C stdio và C++ iostream_ - không phải 'g ++' cung cấp triển khai' iostream' của riêng nó? –

+0

@Maxim: Có, nhưng nó được thiết kế sao cho bố cục nhị phân của lớp giống với bố cục nhị phân của cấu trúc trong glibc stdio, và cùng một đối tượng được sử dụng cho cả hai trường hợp này ... –

5

Trong "C: A Reference Manual, Ấn bản thứ năm "của Harbison & Steele, phần thứ hai của cuốn sách được dành riêng cho thư viện chuẩn C (Phần 2: chương 10-24).

http://careferencemanual.com

Tài liệu Lý do cho C99 không bao gồm các thư viện C nhưng ANSI C89 Lý do bao gồm trong chương của nó 4. Có một bản sao của tài liệu ở đây:

http://www.lysator.liu.se/c/rat/title.html

+0

Hi Cảm ơn bạn đã trả lời, chủ đề về định nghĩa "C89" là một trợ giúp tốt. – swaechter

Các vấn đề liên quan