C, UNIX/Linux και Πρότυπες Βιβλιοθήκες


Όπως είναι γνωστό, υπάρχει ιδιαίτερα στενός δεσμός μεταξύ της C και του UNIX/Linux. Σχεδόν όλόκληρο το λειτουργικό σύστημα και πολλές βασικές εφαρμογές είναι γραμμένες σε C. Αυτή η ενότητα εξετάζει την κοινή λειτουργία C και UNIX/Linux.

  

Πλεονεκτήματα χρήσης C με UNIX/Linux

Χρήση Κλήσεων Συστήματος και Συναρτήσεων Βιβλιοθήκης UNIX/Linux

Παραδείγματα πρότυπων συναρτήσεων βιβλιοθήκης έχουμε ήδη συναντήσει στα εισαγωγικά μαθήματα της C, με πρώτη τη πρότυπη Είσοδο/Έξοδο (stdio.h)  με συναρτήσεις όπως οι fprintf(), scanf(), τη διαχείριση μνήμης --  malloc().

Οι βασικοί αριθμητικοί τελεστές, γεννήτριες τυχαίων αριθμών -- random(), srandom(), lrand48(), drand48() βασικοί τύποι C και τυπική διαχείριση χαρακτήρων και συμβολοσειρών βρίσκονται στη βιβλιοθήκη stdlib.h. Ποχωρημένες συναρτήσεις διαχείρισης συμβολοσειρών βρίσκονται στη βιβλιοθήκη string.h.

Όλες οι υπόλοιπες μαθηματικές συναρτήσεις όπως sin(), cos(), sqrt() βρίσκονται στη πρότυπη μαθηματική βιβλιοθήκη math.h.

Η χρήση κλήσεων συστήματος και συναρτήσεων βιβλιοθήκης σε ένα πρόγραμμα C είναι εύκολη. Απαιτεί απλά την κατάλληλη οδηγία προεπεξεργαστή #include ώστε να ενσωματωθεί το αντίστοιχο αρχείο κεφαλής  Στη συνέχεια απλά καλούμε τη κατάλληλη συνάρτηση μέσα στο πρόγραμμά μας.

Είναι σημαντικό να ελέγχουμε οτι κατά τη κλήση χρησιμοποιούμε τον σωστό αριθμό, διάταξη και τύπο ορισμάτων, αλλιώς θα παρουσιαστούν σφάλματα. Ένας επικυρωτής προγραμμάτων όπως ο splint είναι καλός για τέτοιους ελέγχους.

Μερικές βιβλιοθήκες απαιτούν επιπλέον επιλογές, όπως την επιλογή μεταγλώττισης -l  ώστε να συνδεθεί ο αντίστοιχος αντικείμενος κώδικας. Για παράδειγμα η κλήση της πρότυπης μαθηματικής βιβλιοθήκης math.h απαιτεί μεταγλώττιση ως εξής

   gcc mathprog.c -o mathprog -lm

Η επιλογή -lm συνδέει τη μαθηματική βιβλιοθήκη. Το εγχειρίδιο κάθε βιβλιοθήκης δίνει σχετικές οδηγίες. Για περισσότερα εκτελέστε 

   man libc ή info libc

ή συμβουλευτείτε τη διεύθυνση

  http://www.gnu.org/software/libc 

Το εγχειρίδιο των πρότυπων βιβλιοθηκών της GNU C είναι οργανωμένο θεματικά, έτσιι ώστε μπορούμε να αναζητήσουμε τη κατάλληλη συνάρτηση και βιβλιοθήκη για τηνεργασία που θέλουμε να υλοποιήσουμε, π.χ. διαχείριση καταλόγων. 

Από την άλλη πλευρά το index του εγχειριδίου και η τεκμηρίωση τύπου man ή info είναι ιδιαίτερα χρήσιμη όταν γνωρίζουμε το όνομα μιας συνάρτησης (ή περίπου) και θέλουμε να βρούμε τον ορισμό και παραδείγματα χρήσης.

Είναι καλό να έχετε στη διάθεσή σας, τα παραπάνω εγχειρίδια, μαζί με το βασικό έγχειρίδιο της GCC ώστε να αποφεύγετε άσκοπες καθυστερήσεις.

Η πρόπυπη βιβλιοθήκης της GNU C (Glibc) εξασφαλίζει συμβατότητα τόσο με το κλασσικό πρότυπο της ANSI C , όσο και με τα Single UNIX Specification, POSIX (1c, 1d, and 1j), και με τα πρότυπα ISO C99, Berkeley Unix (BSD) Inreface, the System V Interface Description (SVID) και το X/Open Portability Guide (XPG), Issue 4.2, με όλες τις κοινές επεκτάσεις του XSI (X/Open System Interface) και X/Open UNIX. Επιλέον έχει και μερικές ειδικές επεκτάσεις για την ανάπτυξη εφαρμογών GNU.

Το πρότυπο Single UNIX Specification είναι η ανάπτυξη του προτύπου POSIX εξασφαλίζει τη μέγιστη δυνατή συμβατότητα στην ανάπτυξη εφαρμογών UNIX/Linux. Η διαχείρισή του είναι ευθύνη τοy Open Group και της IEEE, η δε τρέχουσα έκδοση βρίσκεται στο

  http://www.opengroup.org/onlinepubs/009695399/nframe.html

Παρακάτω δίνονται δύο πίνακες με τα ονόματα των αρχείων κεφαλής καθώς και σύντομη περιγραφή των περιεχομένων των διαθέσιμων πρότυπων βιβλιοθηκών της C.

ANSI C library header files

<assert.h> Contains the assert macro, used to assist with detecting logical errors and other types of bug in debugging versions of a program.
<complex.h> A set of functions for manipulating complex numbers. (New with C99)
<ctype.h> Contains functions used to classify characters by their types or to convert between upper and lower case in a way that is independent of the used character set (typically ASCII or one of its extensions, although implementations utilizing EBCDIC are also known).
<errno.h> For testing error codes reported by library functions.
<fenv.h> For controlling floating-point environment. (New with C99)
<float.h> Contains defined constants specifying the implementation-specific properties of the floating-point library, such as the minimum difference between two different floating-point numbers (_EPSILON), the maximum number of digits of accuracy (_DIG) and the range of numbers which can be represented (_MIN, _MAX).
<inttypes.h> For precise conversion between integer types. (New with C99)
<iso646.h> For programming in ISO 646 variant character sets. (New with NA1)
<limits.h> Contains defined constants specifying the implementation-specific properties of the integer types, such as the range of numbers which can be represented (_MIN, _MAX).
<locale.h> For setlocale() and related constants. This is used to choose an appropriate locale.
<math.h> For computing common mathematical functions
<setjmp.h> Declares the macros setjmp and longjmp, which are used for non-local exits
<signal.h> For controlling various exceptional conditions
<stdarg.h> For accessing a varying number of arguments passed to functions.
<stdbool.h> For a boolean data type. (New with C99)
<stdint.h> For defining various integer types. (New with C99)
<stddef.h> For defining several useful types and macros.
<stdio.h> Provides the core input and output capabilities of the C language. This file includes the venerable printf function.
<stdlib.h> For performing a variety of operations, including conversion, pseudo-random numbers, memory allocation, process control, environment, signalling, searching, and sorting.
<string.h> For manipulating several kinds of strings.
<tgmath.h> For type-generic mathematical functions. (New with C99)
<time.h> For converting between various time and date formats.
<wchar.h> For manipulating wide streams and several kinds of strings using wide characters - key to supporting a range of languages. (New with NA1)
<wctype.h> For classifying wide characters. (New with NA1)

C POSIX library header files

<cpio.h> Magic numbers for the cpio archive format.
<dirent.h> Allows the opening and listing of directories.
<fcntl.h> File opening, locking and other operations.
<grp.h> User group information and control.
<pwd.h> passwd (user information) access and control.
<sys/ipc.h> Inter-process communication (IPC).
<sys/msg.h> POSIX message queues.
<sys/sem.h> POSIX semaphores.
<sys/stat.h> File information (stat et al).
<sys/time.h> Time and date functions and structures.
<sys/types.h> Various data types used elsewhere.
<sys/utsname.h> uname and related structures.
<sys/wait.h> Status of terminated child processes (see wait)
<tar.h> Magic numbers for the tar archive format.
<termios.h> Allows terminal I/O interfaces.
<unistd.h> Various essential POSIX functions and constants.
<utime.h> inode access and modification times.

Στις επόμενες ενότητες εξετάζονται αρκετές πρότυπες βιβλιοθήκες της C και κλήσεις συστήματος του UNIX/Linux. 

Πληροφορίες Συναρτήσεων Βιβλιοθηκών

Οι σελίδες πληροφοριών και βοήθειας των περισσοτέρων συστημάτων UNIX/Linux περιέχουν αναφορές για όλες τις διαθέσιμες συναρτήσεις. Ανάλογα με τον τύπο του συστήματος σας δοκιμάστε είτε τις εντολές man ή info ή τη βοήθεια από τη γραφική διεπαφή χρήστη. Έστω, π.χ. οτι ενδιαφέρεστε για τη συνάρτηση sqrt. Τότε γράφετε:

    man sqrt ή info sqrt

ή εισάγετε το όνομα της συνάρτησης στο πλαίσιο αναζήτησης της γραφικής βοήθειας. Αν δεν γνωρίζετε το όνομα της συνάρτηση δοκιμάστε 

    man gcc ή info gcc ή man libc ή info libc

Σε περίπτωση που δεν υπάρχει πληροφορία ελέγξτε μήπωςδεν έχει εγκατασταθεί η τεκμηρίωση της C, και ειδικότερα των βιβλιοθηκών της. Τότε θα πρέπει να την εγκαταστήσετε. Αξίζει τον κόπο αφού περιλαμβάνεται σημαντικότατος αριθμός συναρτήσεων. Σε κάθε περίπτωση η τεκμηρίωση είναι διαθέσιμη στοn ιστοτόπο

  http://www.gnu.org/software/libc/

Σε κάθε σελίδα πληροφόρησης, η ενότητα SYNOPSIS περιλαμβάνει οδηγίες χρήσης της συνάρτησης. Για παράδειγμα:

  #include <time.h>

char *ctime(time_t *clock)

Αυτό σημαίνει οτι για να καλέσετε τη συνάρτηση ctime θα πρέπει να εισάγετε στο πρόγραμμά σας την οδηγία προεπεξεργαστή 

  #include <time.h>

Επίσης η συνάρτηση ctime δέχεται ως παράμετρο clock ένα δείκτη σε μεταβλητή τύπου time_t και επιστρέφει μια συμβολοσειρά (char *)

H ενότητα DESCRIPTION παρουσιάζει μια σύντομη περιγραφή της λειτουργίας της συνάρτησης. Για παράδειγμα: 

  ctime() converts a long integer, pointed to by clock,  to  a
26-character string of the form produced by asctime().

Ασκήσεις

Άσκηση 12173

Κοιτάξτε στο /lib και /usr/lib και δείτε ποιές βιβλιοθήκες είναι διαθέσιμες.

Άσκηση 12174

Κοιτάξτε στο /usr/include και δείτε ποιά αρχεία κεφαλής είναι διαθέσιμα.


Dave Marshall
1/5/1999
μετάφραση και προσαρμογή στα Ελληνικά Κ.Γ. Μαργαρίτης
3/3/2008