ubuntuusers.de

Dup Befehl Verwendung

Status: Ungelöst | Ubuntu-Version: Kubuntu 14.04 (Trusty Tahr)
Antworten |

momooo

Anmeldungsdatum:
11. Oktober 2017

Beiträge: 23

Hallo liebe Leute,

wie im Titel schon angegeben, würde ich gerne wissen, weshalb man ein File Descriptor kopiert? Also wenn ich nicht falsch liege, dupliziert mir der Dup-Befehl ein File Descriptor aber wozu brauch ich eine Kopie?

Lg

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13174

momooo schrieb:

wie im Titel schon angegeben, würde ich gerne wissen, weshalb man ein File Descriptor kopiert? Also wenn ich nicht falsch liege, dupliziert mir der Dup-Befehl ein File Descriptor aber wozu brauch ich eine Kopie?

Meist ist das der Fall, weil bestimmte Dateideskriptoren (0, 1 und 2 nämlich) für bestimmte Aufgaben reserviert sind und man z.B. den ursprünglichen erhalten will:

1
2
3
exec 9>&1 1>/dev/null
irgendein-programm das Ausgaben nach stdout produziert
echo "Fortschritt: wir haben eben irgendein-programm ausgeführt" >&9

Dieses Programm sorgt dafür, dass die Ausgaben aller gestarteten Prozesse nach /dev/null gehen, aber man Fortschrittsausgabe für dieses Programm auf den ursprünglichen stdout machen kann (normalerweise ein Terminal, aber der Dateideskriptor kann auch umgeleitet sein).

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2505

Oder:

  • Du hast einen Prozess.

  • Du erstellst eine Pipe mit dem „pipe()“-Syscall. Das liefert dir zwei neue Deskriptoren: Das eine Ende der Pipe, von dem du lesen kannst, und ins andere Ende kannst du reinschreiben.

  • Du rufst „fork()“ auf, um deinen Prozess zu kopieren.

  • In der Kopie machst du „dup2(pipe_read_fd, 0)“, um unter fd 0 (was ja nach Konvention dein stdin ist) dasjenige Ende der Pipe zur Verfügung zu haben, von dem du lesen kannst.

  • Vielleicht macht das Kind jetzt noch ein „exec*()“.

  • Somit kannst du im Elternprozess in die Pipe reinschreiben und das Kind liest ganz gewöhnlich von seinem stdin, ohne irgendwas von einer Pipe wissen zu müssen.

In eine ähnliche Kerbe schlägt:

  • Du machst „fd = open(path, ...)“, was dir ja einen neuen FD liefert.

  • Dann machst du „dup2(fd, 1)“, damit der nachfolgende Code einfach nach stdout schreiben kann, bloß landet die Ausgabe nun in einer Datei.

Das ist nichts anderes als eine Umleitung „befehl >ausgabe.log“ an der Shell, bloß merkt man da nichts vom dup.

Je nach Sichtweise kann das alles eher wie so eine Art „Verschieben“ des FD wirken und nicht „Kopieren“ im Sinne von „ich habe den FD zweimal und kann verschiedene Dinge damit tun“ oder so. (Hoffe, es kommt rüber, was ich meine.) Weil es aber eben nur kopiert, muss man daran denken, hier und da noch ein „close()“ einzustreuen.

momooo

(Themenstarter)

Anmeldungsdatum:
11. Oktober 2017

Beiträge: 23

Vielen dank für die vielen Antworten, jetzt ist es mir klarer ☺

Antworten |