Link auf eine geöffnete Datei

25/01/2011 - 11:03 von Ole Streicher | Report spam
Hallo,

ich habe folgendes Problem: ich habe von einer Datei nur den
Dateidescriptor und möchte gerne einen neuen Link dafür anlegen. Also
etwa so etwas:

-8<
int get_result_fd(void) {
execl("some_dump_program", NULL);
int fd = open("program_output.dat", O_RDWR);
unlink("program_output.dat"); /* Datei bleibt erhalten, solange geöffnet */
return fd;
}

int fd = get_result();

/* Hier kann der Nutzer an der Datei herumbasteln. */

if (permament) { /* vielleicht will er sie ja speichern? */
link_fd(fd, "permanent_output.dat"); /* !!! */
}
close(fd); /* Hier wird die Datei gelöscht, wenn nicht gespeichert */
-8<

Da die Datei ja erhalten bleibt, solange es noch einen geöffneten
Dateidescriptor gibt, sollte das Anlegen eines neuen Links eigentlich
problemlos möglich sein, allerdings finde ich keine Funktion (markiert
mit "!!!") dafür.

Dass das natürlich nur im gleichen Dateisystem wie die Ausgangsdatei
geht, ist mir klar; ebenso, dass der obige Code keinerlei
Fehlerbehandlung hat, um die Aufmerksamkeit auf das genannte Problem zu
konzentrieren.

Wie könnte man eine geöffnete Datei, deren Filedeskriptor bekannt ist,
effektiv speichern? write(fd, ...); ist für große Dateien (es geht hier
um z.T. 'zig bis hunderte Gigabytes) nicht besonders effektiv.

Viele Grüße

Ole
 

Lesen sie die antworten

#1 Markus Wichmann
25/01/2011 - 15:55 | Warnen spam
Ole Streicher schrieb:
Hallo,

ich habe folgendes Problem: ich habe von einer Datei nur den
Dateidescriptor und möchte gerne einen neuen Link dafür anlegen. Also
etwa so etwas:

-8<
int get_result_fd(void) {
execl("some_dump_program", NULL);



Du meinst wohl

fork() || execl(...);
wait();
int fd = open("program_output.dat", O_RDWR);
unlink("program_output.dat"); /* Datei bleibt erhalten, solange geöffnet */
return fd;
}

int fd = get_result();

/* Hier kann der Nutzer an der Datei herumbasteln. */

if (permament) { /* vielleicht will er sie ja speichern? */
link_fd(fd, "permanent_output.dat"); /* !!! */
}
close(fd); /* Hier wird die Datei gelöscht, wenn nicht gespeichert */
-8<

Da die Datei ja erhalten bleibt, solange es noch einen geöffneten
Dateidescriptor gibt, sollte das Anlegen eines neuen Links eigentlich
problemlos möglich sein, allerdings finde ich keine Funktion (markiert
mit "!!!") dafür.

Dass das natürlich nur im gleichen Dateisystem wie die Ausgangsdatei
geht, ist mir klar; ebenso, dass der obige Code keinerlei
Fehlerbehandlung hat, um die Aufmerksamkeit auf das genannte Problem zu
konzentrieren.

Wie könnte man eine geöffnete Datei, deren Filedeskriptor bekannt ist,
effektiv speichern? write(fd, ...); ist für große Dateien (es geht hier
um z.T. 'zig bis hunderte Gigabytes) nicht besonders effektiv.




Wenn UNIX eine Möglichkeit nicht liefert, solltest du nicht versuchen,
sie zu benutzen.

Eine Möglichkeit wàre, den Output stehen zu lassen und bei Bedarf zu
Löschen. Das hat leider nicht die gleiche Semantik. Dem kann ich aber
auch nicht abhelfen.

Viele Grüße

Ole



Tschö,
Markus

Ähnliche fragen