Systemaufrufe in C
Eine (statische) Bibliothek ist eine Sammlung von Objektdateien, also beispielsweise kompilierten C -Programme. Ihre Einträge werden beim Binden eines Programms ganz oder teilweise zu dem Programm hinzugefügt; sie werden damit also ein Teil des erzeugten ausführbaren Programms. Nach entsprechender Einstellung des Binders und dem Einfügen passender Include -Direktiven, können Funktionen aus Bibliotheken aufgerufen werden.
Betriebssysteme stellen oft Bibliotheken zum Zugriff auf ihre Funktionen („Systemaufrufe“) bereit.
Programme, die von diesen Betriebssystemfunktionen Gebrauch machen, sind dann aber keine portablen Standard-C -Programme mehr. (Jedoch gibt es auch auf diesem Gebiet teilweise Versuche einer Standardisierung, so hatte Windows NT beispielsweise einige POSIX -Aufrufe unterstützt, wie sie auch von Linux unterstützt werden.)
- Durchlaufen eines Verzeichnisses
#include <stdio.h> /* perror */
#include <stdlib.h> /* EXIT_FAILURE, EXIT_SUCCESS */ #include <sys/types.h> /* (allgemein) */ #include <dirent.h> /* DIR, struct dirent, opendir, readdir */
#include <sys/stat.h> /* struct stat, stat, S_ISDIR, S_ISREG */
#include <unistd.h> /* chdir */ void entry( struct dirent * const direntp )
{ struct stat buf;
if( stat( direntp->d_name, &buf )== -1 )perror( "stat\n" );
else if( S_ISDIR( buf.st_mode ))printf( "/ %s\n", direntp->d_name );
else if( S_ISREG( buf.st_mode ))printf( " %s\n", direntp->d_name); } int dir( DIR * const dirp )
{ struct dirent * direntp;
while( direntp = readdir( dirp ))entry( direntp );
return EXIT_SUCCESS; } int open( char const * const path )
{ int result; DIR * const dirp = opendir( path ); if( dirp )
{ chdir( path );
result = dir( dirp );
closedir( dirp ); }
else perror( "opendir\n" );
return result; } int main( void )
{ return open( "/" ); }
perror
Druckt den Argumenttext und anschließend einen von »errno« abhängenden Text. Einige Funktionen schreiben einen Statuscode in die ganzzahlige Variable »errno« (eine Variable mit externer Bindung und Dateigültigkeitsbereich), falls bei ihrer Ausführung ein Laufzeitfehler aufgetreten ist. Durch einen Aufruf von »perror« kann dem Benutzer dann die Bedeutung dieses Fehlercodes angezeigt werden.
- / Präsenzaufgabe Dateigröße
- Schreiben Sie das obenstehende Programm so um, daß es auch die Größen der Dateien ausgibt.
- / Übungsaufgabe Unterverzeichnisse
- Schreiben Sie das obenstehende Programm so um, daß es auch die Inhalte der Unterverzeichnisse bis zu einer beliebigen Verschachtelungstiefe von Unterverzeichnissen ausgibt.
- (Das obige Programm kann auch als Ausgangspunkt für eine persönliche Variante des Kommandos »ls« dienen.)
- Zusatzaufgabe Summieren Sie dabei die Dateigrößen um die Summer der Dateigrößen eines Verzeichnisses anzuzeigen.
- Suchen nach bestimmten Dateien unter Linux
whereis dirent.h
- Abschnitte des Linux -Handbuchs
1
user commands2
system calls3
library functions4
special files5
file formats6
games7
conventions and miscellany8
administration and privileged commandsL
math library functionsN
tcl functions- http://linux.ctyme.com/
- Handbuchseite für den Systemaufruf »stat«
man 2 stat man 2 -k dirent
- Literatur für Systemaufrufe
- POSIX: http://www.unix.org/apis.html
- Advanced Programming in the UNIX Environment, Addison-Wesley, 1992, W. Richard Stevens, ISBN 0-201-56317-7
- Linux-Unix-Kurzreferenz von Helmut Herold im Addison-Wesley-Verlag