12
.pdfЛекция 12, 2021
Библиотека glibc.
Общие сведения
Язык С спроектирован как лаконичный язык и не предоставляет встроенных средств для выполнения таких распространенных операций, как низкоуровневой или форматированный ввод/вывод, управление строками, вычисление арифметических и математических функций, управление памятью, процессами, файловыми системами, сетевыми соединениями и тому подобное. Для решения подобных задач применяется стандартная библиотека языка Си (также известная как libc).
Сама по себе библиотека не является частью языка, однако предусмотренный в ней набор функций, а также определений типов и макроопределений составляет системную среду, поддерживающую разработку ПО на Си.
В 1978 году Брайан Керниган и Деннис Ритчи опубликовали первую редакцию книги «Язык программирования Си», содержащую систематическое описание такого подхода. Эта книга, известная среди программистов как «K&R», служила многие годы неформальной спецификацией языка и выдержала в США около сорока изданий. Подход «K&R» и его реализации оказались очень плодотворными и активно использовались при разработке большого числа проектов.
Библиотека libc была стандартизована в 1989 г. как часть стандарта ANSI C, который в 1990 г. был признан ISO (текущая актуальная версия стандарта, т. н. C18 — ISO/IEC 9899:2018 Information technology — Programming languages — C). Библиотека состоит из нескольких десятков заголовочных файлов, подключаемых к программному проекту директивами. Эти файлы содержит описания одной или более функций, определения типов данных и макроопределения.
NBNB. В стандарте библиотека представлена как описание интерфейса прикладного программирования — API (Application
Programming Interface) и для практического применения она должна быть реализована для конкретного компилятора и/или операционной системы. Таким образом libc является неотъемлемой частью каждой реализации языка Cи.
Cуществует несколько десятков реализаций libc, в том числе такие широко применяемые как GNU C Library — glibc — самая распространенная реализация, используемая в ОС Linux, Microsoft C Run-time Library, используемая в ОС Windows, libSystem,
используемая в ОС iOS компании Apple и Bionic, разработанная компанией Google для ОС Android.
Библиотека libc оказала основополагающее влияние на реализации большинства современные системы программирования, среди которых C++, Python, Rust и др. Например каждый заголовочный файл из стандартной библиотеки языка Си включен в стандартную библиотеку языка C++ под именами, созданными путём отсечения в имени файла расширения .h и добавлением символа 'c' в начале имени, например имени
'time.h' соответствует 'ctime'.
Единственное отличие между этими заголовочными файлами и традиционными заголовочными файлами стандартной библиотеки языка Си заключается в том, что функции должны быть помещены в пространство имен std:: (хотя некоторые компиляторы сами делают это).
Библиотека glibc обновляется два раза в год. Ее функции, требующие работы в адресном пространстве ядра, используют системные вызовы В руководстве к актуальной версии glibc функции разбиты на 36 групп различного назначения. Информацию о текущей версии glibc, установленной в конкретной версии ОС Linux можно получит командой:
/lib/libc.so.6
Ссылки на описание glibc:
https://www.gnu.org/software/libc/manual/
Общая характеристика glibc на 25.04.2021 со стр. https://www.openhub.net/p/glibc
Code Locations: git://sourceware.org/git/glibc.git
In a Nutshell, GNU C Library...
...
has had 37,147 commits made by 604 contributors representing 1,302,579 lines of code
...
is mostly written in C
with an average number of source code comments:
Across all C projects on Open Hub, 19% of all source code lines are comments. This holds true for GNU C Library as well.
...
has a well established, mature codebase maintained by a very large development team with increasing Y-O-Y commits
...
took an estimated 371 years of effort (COCOMO model) starting with its first commit in February, 1995
ending with its most recent commit 7 months ago
COCOMO Constructive Cost Model
Данные на 25.04.2021 о распределении языков программирования в коде со стр.: https://www.openhub.net/p/glibc/analyses/latest/languages_summary
Language |
Code Lines |
Comment |
Comment |
Blank |
Total Lines Total Percentage |
||
Lines |
Ratio |
Lines |
|||||
|
|
|
|
||||
C |
971,675 |
238,172 |
19.7% |
152,531 |
1,362,378 |
74.0% |
|
Assembly |
257,940 |
75,262 |
22.6% |
40,667 |
373,869 |
20.3% |
|
C++ |
17,017 |
6,662 |
28.1% |
4,131 |
27,810 |
1.5% |
|
Autoconf |
15,117 |
153 |
1.0% |
1,719 |
16,989 |
0.9% |
|
Make |
12,581 |
2,802 |
18.2% |
2,759 |
18,142 |
1.0% |
|
shell script |
9,694 |
2,026 |
17.3% |
1,177 |
12,897 |
0.7% |
|
Python |
8,863 |
3,897 |
30.5% |
1,413 |
14,173 |
0.8% |
|
TeX/LaTeX |
7,163 |
3,695 |
34.0% |
816 |
11,674 |
0.6% |
|
AWK |
1,898 |
373 |
16.4% |
266 |
2,537 |
0.1% |
|
Perl |
631 |
143 |
18.5% |
87 |
861 |
0.0% |
|
Totals |
1,302,579 |
333,185 |
|
205,566 |
1,841,330 |
|
Освоив соглашения стандарта ABI о связях функций разработчик получает доступ из языка ассемблера и из всех других языков и систем программирования, поддерживающих ABI к примерно 1500 (количество зависит от версии и реализации) функций библиотеки языка glibc, представляющей золотой фонд программирования.
Рассмотрим кратко оглавление руководства по библиотке glibc.
Table of Contents
•1 Introduction
•1.1 Getting Started
•1.2 Standards and Portability
•1.2.1 ISO C
•1.2.2 POSIX (The Portable Operating System Interface)
•1.2.2.1 POSIX Safety Concepts
•1.2.2.2 Unsafe Features
•1.2.2.3 Conditionally Safe Features
•1.2.2.4 Other Safety Remarks
•1.2.3 Berkeley Unix
•1.2.4 SVID (The System V Interface Description)
•1.2.5 XPG (The X/Open Portability Guide)
•1.3 Using the Library
•1.3.1 Header Files
•1.3.2 Macro Definitions of Functions
•1.3.3 Reserved Names
•1.3.4 Feature Test Macros
•1.4 Roadmap to the Manual
•2 Error Reporting
•2.1 Checking for Errors
•2.2 Error Codes
•2.3 Error Messages
•3 Virtual Memory Allocation And Paging
•3.1 Process Memory Concepts
•3.2 Allocating Storage For Program Data
•3.2.1 Memory Allocation in C Programs
•3.2.1.1 Dynamic Memory Allocation
•3.2.2 The GNU Allocator
•3.2.3 Unconstrained Allocation
•3.2.3.1 Basic Memory Allocation
•3.2.3.2 Examples of malloc
•3.2.3.3 Freeing Memory Allocated with malloc
•3.2.3.4 Changing the Size of a Block
•3.2.3.5 Allocating Cleared Space
•3.2.3.6 Allocating Aligned Memory Blocks
•3.2.3.7 Malloc Tunable Parameters
•3.2.3.8 Heap Consistency Checking
•3.2.3.9 Memory Allocation Hooks
•3.2.3.10 Statistics for Memory Allocation with malloc
•3.2.3.11 Summary of malloc-Related Functions
•3.2.4 Allocation Debugging
•3.2.4.1 How to install the tracing functionality
•3.2.4.2 Example program excerpts
•3.2.4.3 Some more or less clever ideas
•3.2.4.4 Interpreting the traces
•3.2.5 Replacing malloc
•3.2.6 Obstacks
•3.2.6.1 Creating Obstacks
•3.2.6.2 Preparing for Using Obstacks
•3.2.6.3 Allocation in an Obstack
•3.2.6.4 Freeing Objects in an Obstack
•3.2.6.5 Obstack Functions and Macros
•3.2.6.6 Growing Objects
•3.2.6.7 Extra Fast Growing Objects
•3.2.6.8 Status of an Obstack
•3.2.6.9 Alignment of Data in Obstacks
•3.2.6.10 Obstack Chunks
•3.2.6.11 Summary of Obstack Functions
•3.2.7 Automatic Storage with Variable Size
•3.2.7.1 alloca Example
•3.2.7.2 Advantages of alloca
•3.2.7.3 Disadvantages of alloca
•3.2.7.4 GNU C Variable-Size Arrays
•3.3 Resizing the Data Segment
•3.4 Memory Protection
•3.4.1 Memory Protection Keys
•3.5 Locking Pages
•3.5.1 Why Lock Pages
•3.5.2 Locked Memory Details
•3.5.3 Functions To Lock And Unlock Pages
•4 Character Handling
•4.1 Classification of Characters
•4.2 Case Conversion
•4.3 Character class determination for wide characters
•4.4 Notes on using the wide character classes
•4.5 Mapping of wide characters.
•5 String and Array Utilities
•5.1 Representation of Strings
•5.2 String and Array Conventions
•5.3 String Length
•5.4 Copying Strings and Arrays
•5.5 Concatenating Strings
•5.6 Truncating Strings while Copying
•5.7 String/Array Comparison
•5.8 Collation Functions
•5.9 Search Functions
•5.9.1 Compatibility String Search Functions
•5.10 Finding Tokens in a String
•5.11 Erasing Sensitive Data
•5.12 Shuffling Bytes
•5.13 Obfuscating Data
•5.14 Encode Binary Data
•5.15 Argz and Envz Vectors
•5.15.1 Argz Functions
•5.15.2 Envz Functions
•6 Character Set Handling
•6.1 Introduction to Extended Characters
•6.2 Overview about Character Handling Functions
•6.3 Restartable Multibyte Conversion Functions
•6.3.1 Selecting the conversion and its properties
•6.3.2 Representing the state of the conversion
•6.3.3 Converting Single Characters
•6.3.4 Converting Multibyte and Wide Character Strings
•6.3.5 A Complete Multibyte Conversion Example
•6.4 Non-reentrant Conversion Function
•6.4.1 Non-reentrant Conversion of Single Characters
•6.4.2 Non-reentrant Conversion of Strings
•6.4.3 States in Non-reentrant Functions
•6.5 Generic Charset Conversion
•6.5.1 Generic Character Set Conversion Interface
•6.5.2 A complete iconv example
•6.5.3 Some Details about other iconv Implementations
•6.5.4 The iconv Implementation in the GNU C Library
•6.5.4.1 Format of gconv-modules files
•6.5.4.2 Finding the conversion path in iconv
•6.5.4.3 iconv module data structures
•6.5.4.4 iconv module interfaces
•7 Locales and Internationalization
•7.1 What Effects a Locale Has
•7.2 Choosing a Locale
•7.3 Locale Categories
•7.4 How Programs Set the Locale
•7.5 Standard Locales
•7.6 Locale Names
•7.7 Accessing Locale Information
•7.7.1 localeconv: It is portable but …
•7.7.1.1 Generic Numeric Formatting Parameters
•7.7.1.2 Printing the Currency Symbol
•7.7.1.3 Printing the Sign of a Monetary Amount
•7.7.2 Pinpoint Access to Locale Data
•7.8 A dedicated function to format numbers
•7.9 Yes-or-No Questions
•8 Message Translation
•8.1 X/Open Message Catalog Handling
•8.1.1 The catgets function family
•8.1.2 Format of the message catalog files
•8.1.3 Generate Message Catalogs files
•8.1.4 How to use the catgets interface
•8.1.4.1 Not using symbolic names
•8.1.4.2 Using symbolic names
•8.1.4.3 How does to this allow to develop
•8.2 The Uniforum approach to Message Translation
•8.2.1 The gettext family of functions
•8.2.1.1 What has to be done to translate a message?
•8.2.1.2 How to determine which catalog to be used
•8.2.1.3 Additional functions for more complicated situations
•8.2.1.4 How to specify the output character set gettext uses
•8.2.1.5 How to use gettext in GUI programs
•8.2.1.6 User influence on gettext
•8.2.2 Programs to handle message catalogs for gettext
•9 Searching and Sorting
•9.1 Defining the Comparison Function
•9.2 Array Search Function
•9.3 Array Sort Function
•9.4 Searching and Sorting Example
•9.5 The hsearch function.
•9.6 The tsearch function.
•10 Pattern Matching
•10.1 Wildcard Matching
•10.2 Globbing
•10.2.1 Calling glob
•10.2.2 Flags for Globbing
•10.2.3 More Flags for Globbing
•10.3 Regular Expression Matching
•10.3.1 POSIX Regular Expression Compilation
•10.3.2 Flags for POSIX Regular Expressions
•10.3.3 Matching a Compiled POSIX Regular Expression
•10.3.4 Match Results with Subexpressions
•10.3.5 Complications in Subexpression Matching
•10.3.6 POSIX Regexp Matching Cleanup
•10.4 Shell-Style Word Expansion
•10.4.1 The Stages of Word Expansion
•10.4.2 Calling wordexp
•10.4.3 Flags for Word Expansion
•10.4.4 wordexp Example
•10.4.5 Details of Tilde Expansion
•10.4.6 Details of Variable Substitution
•11 Input/Output Overview
•11.1 Input/Output Concepts
•11.1.1 Streams and File Descriptors
•11.1.2 File Position
•11.2 File Names
•11.2.1 Directories
•11.2.2 File Name Resolution
•11.2.3 File Name Errors
•11.2.4 Portability of File Names
•12 Input/Output on Streams
•12.1 Streams
•12.2 Standard Streams
•12.3 Opening Streams
•12.4 Closing Streams
•12.5 Streams and Threads
•12.6 Streams in Internationalized Applications
•12.7 Simple Output by Characters or Lines
•12.8 Character Input
•12.9 Line-Oriented Input
•12.10 Unreading
•12.10.1 What Unreading Means
•12.10.2 Using ungetc To Do Unreading
•12.11 Block Input/Output
•12.12 Formatted Output
•12.12.1 Formatted Output Basics
•12.12.2 Output Conversion Syntax
•12.12.3 Table of Output Conversions
•12.12.4 Integer Conversions
•12.12.5 Floating-Point Conversions
•12.12.6 Other Output Conversions
•12.12.7 Formatted Output Functions
•12.12.8 Dynamically Allocating Formatted Output
•12.12.9 Variable Arguments Output Functions
•12.12.10 Parsing a Template String
•12.12.11 Example of Parsing a Template String
•12.13 Customizing printf
•12.13.1 Registering New Conversions
•12.13.2 Conversion Specifier Options
•12.13.3 Defining the Output Handler
•12.13.4 printf Extension Example
•12.13.5 Predefined printf Handlers
•12.14 Formatted Input
•12.14.1 Formatted Input Basics
•12.14.2 Input Conversion Syntax
•12.14.3 Table of Input Conversions
•12.14.4 Numeric Input Conversions
•12.14.5 String Input Conversions
•12.14.6 Dynamically Allocating String Conversions
•12.14.7 Other Input Conversions
•12.14.8 Formatted Input Functions
•12.14.9 Variable Arguments Input Functions
•12.15 End-Of-File and Errors
•12.16 Recovering from errors
•12.17 Text and Binary Streams
•12.18 File Positioning
•12.19 Portable File-Position Functions
•12.20 Stream Buffering
•12.20.1 Buffering Concepts
•12.20.2 Flushing Buffers
•12.20.3 Controlling Which Kind of Buffering
•12.21 Other Kinds of Streams
•12.21.1 String Streams
•12.21.2 Programming Your Own Custom Streams
•12.21.2.1 Custom Streams and Cookies
•12.21.2.2 Custom Stream Hook Functions
•12.22 Formatted Messages
•12.22.1 Printing Formatted Messages
•12.22.2 Adding Severity Classes
•12.22.3 How to use fmtmsg and addseverity
•13 Low-Level Input/Output
•13.1 Opening and Closing Files
•13.2 Input and Output Primitives
•13.3 Setting the File Position of a Descriptor
•13.4 Descriptors and Streams
•13.5 Dangers of Mixing Streams and Descriptors
•13.5.1 Linked Channels
•13.5.2 Independent Channels
•13.5.3 Cleaning Streams
•13.6 Fast Scatter-Gather I/O
•13.7 Copying data between two files
•13.8 Memory-mapped I/O
•13.9 Waiting for Input or Output
•13.10 Synchronizing I/O operations
•13.11 Perform I/O Operations in Parallel
•13.11.1 Asynchronous Read and Write Operations
•13.11.2 Getting the Status of AIO Operations
•13.11.3 Getting into a Consistent State
•13.11.4 Cancellation of AIO Operations
•13.11.5 How to optimize the AIO implementation
•13.12 Control Operations on Files
•13.13 Duplicating Descriptors
•13.14 File Descriptor Flags
•13.15 File Status Flags
•13.15.1 File Access Modes
•13.15.2 Open-time Flags
•13.15.3 I/O Operating Modes
•13.15.4 Getting and Setting File Status Flags
•13.16 File Locks
•13.17 Open File Description Locks
•13.18 Open File Description Locks Example
•13.19 Interrupt-Driven Input
•13.20 Generic I/O Control operations
•14 File System Interface
•14.1 Working Directory
•14.2 Accessing Directories
•14.2.1 Format of a Directory Entry
•14.2.2 Opening a Directory Stream
•14.2.3 Reading and Closing a Directory Stream
•14.2.4 Simple Program to List a Directory
•14.2.5 Random Access in a Directory Stream
•14.2.6 Scanning the Content of a Directory
•14.2.7 Simple Program to List a Directory, Mark II
•14.2.8 Low-level Directory Access