ein Kapitel zurück                                           ein Kapitel weiter

Mit dup und dup2 duplizieren wir einen Filedeskriptor.

#include <unistd.h>//bei Linux/Unix
#include <io.h> //bei MS-Dos/Win

int dup(int fd);
int dup2(int fd, int fd1);

dup und dup2 erzeugen eine Kopie des Filedesktiptor fd. Die alten und neuen Deskriptoren können wahlfrei benutzt werden. Sie teilen sich Locks, Dateipositionszeiger (File Position Pointers) und Flags; falls beispielsweise die Dateiposition durch lseek für einen der Deskriptoren verändert wurde, so gilt dies auch für den anderen Filedesrkiptor. Das close-on-exec flag (schliessen-bei-ausführung) teilen sie sich jedoch nicht. dup benutzt den unbenutzten Deskriptor mit der kleinsten Nummer für den neuen. dup2 macht fd1 zur Kopie von fd. Falls Notwendig wir zuvor fd1 geschlossen. dup und dup2 geben bei Erfolg eine Kopie von fd zurück ansonsten -1.

neufd=dup(fd)   ==    neufd=fcntl(fd,F_DUPFD, 0);

......und......

dup2(fd,neufd)   ==   close(neufd); fcntl(fd, F_DUPFD, neufd); 

Zum Beispiel zu dup will ich Ihnen ein Programm demonstrieren bei dem wir stdin,stdout und stderr duplizieren und mit Hilfe der duplizierten Filedeskriporen wollen wir eine Datei öffnen und lesen. Anschließend können sie selbst noch Eingaben machen die durch einen weiteren duplizierten Filedeskriptor auf dem Bildschirm ausgegen wird. Benden können sie das Programm wenn sie keine Eingabe machen und in einer Zeile nur <ENTER> drücken......

/*Download:dup.c*/
#include <stdio.h> #include <unistd.h> #include <sys/stat.h> #include <sys/types.h> #include <fcntl.h> #define PUFFER 512 /*Werte für fdread und fdwrite sind : */ /* 0=Standarteingabe */ /* 1=Standartausgabe */ /* 2=Standartfehler */ int lesen_und_schreiben(int fdread, int fdwrite) { int n; char puffer[PUFFER]; while(( n=read(fdread, puffer, PUFFER)) > 0) if(write(fdwrite, puffer, n) != n) { write(2,"Fehler bei write.....\n",25); exit(0); } } int main(int argc, char **argv) { int fd1,fdout,fdin,fderr,n; char datei[25], puffer[PUFFER]; fdin =dup(0); /*Standarteingabe*/ fdout=dup(1); /*Standartausgabe*/ fderr=dup(2); /*Standartfehler*/ if(argc<2) { write(fderr,"Benutzung : programmname datei\n",35); exit(0); } if((fd1=open(argv[1],O_RDONLY)) == -1) { write(fderr,"Fehler beim öffnen der Datei\n",35); exit(1); } /*Wir geben den Inhalt von fd1 an fdout (Standartausgabe) aus*/ lesen_und_schreiben(fd1,fdout); close(fd1); while((n=read(fdin,puffer,PUFFER)) >1) write(fdout, puffer, n); return 0; }

Hinweis: Mehr Hinweise zu dup und dup2 finden im Kapitel zuvor, fcntl und der Konstante F_DUPFD. Das selbe was dort beschrieben ist, ist auch für dup und dup2 gültig. Ebenfalls in diesem Kapitel finden sie mehr zum close-on-exec Flag.

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf