2010-07-01 4 views
7

Es in ftok erwähnt wird() HandbuchWelche Datei muss ich als Argument Pfadname von ftok() übergeben

key_t ftok(const char *pathname, int proj_id); 

Die ftok() Funktion verwendet, um die Identität des durch den gegebenen Pfadnamen benannte Datei (das muss beziehen sich auf eine vorhandene, zugängliche Datei) ...

Ich bin verwirrt über const char *pathname.

Was wäre die beste Praxis dafür? Auf meinem aktuellen System kann ich "/home/Andrew/anyfile" übergeben, aber es ist nicht möglich, dass andere Systeme, auf denen mein Programm arbeiten muss, diese Datei haben.

Wie benutze ich "/etc/hosts/" oder "/etc/inittab", weil ich sicher bin, dass alle diese Systeme diese beiden Dateien haben werden? Ist es eine gute Idee? Kann es ein Problem verursachen?

Ich möchte den Benutzer nicht bitten, den Dateinamen zum Zeitpunkt der Ausführung einzugeben oder den Dateinamen als Befehlszeilenargument zu übergeben.

Gibt es noch einen anderen und besseren Weg zu entscheiden pathname?
Welcher Weg ist der beste und zuverlässigste?

Danke für Ihre Zeit.

+0

Besserer Weg für was? Verlässlich für was? - Vielleicht ist es besser, eine Aufgabe zu beschreiben, für die ftok verwendet werden soll? – pmod

+0

@Pmod: Eigentlich brauche ich eine Warteschlange, damit meine beiden Programme miteinander kommunizieren können. Die Sache, die mich wirklich verwirrt hat, ist die, welche Datei ich an ftok() übergeben sollte, die immer vorhanden sein wird. [Diese Antwort] (http://stackoverflow.com/questions/3155291/which-file-should-i-pass-as-pathname-argument-of-ftok/3155312#3155312) sagt, dass es in Ordnung ist, '' zu übergeben/etc''. Wenn das so ist, warum Leute andere Dateien weitergeben? Ist es nicht einfach, eine der Systemdateien zu übergeben? –

+0

Als wir die ähnliche Aufgabe hatten (organisierte Kommunikation zwischen zwei Programmen in Linux mit Hilfe der Nachrichtenwarteschlange) - wir verwendeten Datei. Das erste Programm (das wie Server ist - läuft immer) erstellt eine Datei mit einer Nachrichten-ID, dann liest das zweite Programm (Benutzerprogramm) die msg-ID aus dieser Datei und erhält Zugriff auf die Warteschlange. – pmod

Antwort

12

Nun, im Allgemeinen würden Sie eine Datei verwenden, die mit der Anwendung selbst verknüpft ist. Beispielsweise hatten wir eine Anwendung, die eine Konfigurationsdatei in den gemeinsamen Speicher geladen hat (in einer geparsten, effizient zugänglichen Weise - denke an eine XML-Datei, die in In-Memory-Strukturen mit schnellen Zeigern umgewandelt wurde) und wir erstellt das Shared-Memory-Segment aus der ftok abgeleitet von der Konfigurationsdatei selbst.

Im schlimmsten Fall, wenn Sie keine Konfigurationsdateien für Ihre Anwendung haben, versuchen Sie, die ausführbare Datei selbst zu verwenden. Sie können ziemlich sicher sein, dass es irgendwo auf dem System existiert (da Sie es ausführen).

Sie sind auch nicht auf Dateien beschränkt, können Sie /etc selbst oder /tmp oder sogar / verwenden, wenn Sie müssen.

Ich sage "wenn du musst", weil es ein bisschen gefährlich ist. Der Aufruf ftok gibt Ihnen einen eindeutigen Schlüssel basierend auf Ihrer Dateispezifikation und Ihrer ID. Wenn Sie Ihre eigene Datei wie /etc/andrew.conf verwenden, können Sie ziemlich sicher sein, dass Sie keinen Konflikt mit anderen ftok-zurückgegebenen Schlüssel erhalten.

Wenn Sie und alle anderen sich jedoch dafür entscheiden, /tmp als Dateispezifikationsabschnitt zu verwenden, ist das einzige Unterscheidungsmerkmal die ID. Daher ist es viel einfacher, eine Kollision mit anderen Schlüsseln zu bekommen.

Was ich immer getan habe, ist die Dateispezifikation als einen wirklich einzigartigen Wert für meine Anwendung zu verwenden und dann nur die ID für die bestimmte Sache zu verwenden, die ich erstellen möchte.

Also, wenn ich 27 Semaphore benötigen und 15 Shared-Memory-Blöcke, sie alle Verwendung /etc/pax.conf als Dateispezifikation und die IDs von 1 bis 42 (und meine Anwendung weiß welche ID in welchem ​​Objekt bezieht).

+0

"Sie können' '/ etc'' selbst oder' '/ tmp'' oder sogar' '' 'verwenden, wenn Sie müssen." Ist das eine schlechte Idee? Wenn es erlaubt ist, warum haben Sie es nicht in Ihrer Bewerbung verwendet? Das verwirrt mich. Wenn wir ''/etc/hosts'' oder irgendeine andere Systemdatei verwenden können, die immer vorhanden ist, warum müssen wir dann nach anderen Wegen suchen? Bitte erläutern Sie es. Danke –

+1

@andrew: Siehe Update. – paxdiablo

+0

+1 Danke paxdiablo –

1

Sie können dynamisch eine char * für eine auf einer Konfigurationsdatei oder einen Befehlszeilenparameter basiert Pfad bauen usw.

einfach, dass char passieren * in die Funktion.

2

Wahrscheinlich ist das Beste, Argv [0] von einem Ihrer ausführbaren Dateien zu verwenden. Die Manpage sagt

The resulting value is the same for all pathnames that name the same file, ... 

so sollten Sie sicher sein, auch wenn Ihre ausführbare Datei manchmal über eine symbolische Verbindung oder so aufgerufen wird.

+0

Sicher! Aber dann, wie anderes Programm darüber wissen wird? Pfadname und proj_id sollten in beiden Programmen gleich sein, damit ftok() denselben Schlüssel generiert. Einer von ihnen benutzt argv [0], also wie andere davon wissen werden? Freundlich ausgearbeitet. –

+0

Die Idee von ftok ist, dass die beiden Programme allgemein bekannt sind. Ich würde annehmen, dass sie die ausführbaren Namen von einander kennen. Dann haben Sie den zusätzlichen Schlüssel, der hilft, mehrere Sitzungen derselben Anwendung zu unterscheiden. In jedem Fall müssen Sie dieses allgemeine Wissen beim Start teilen, z. B. mit einer Umgebungsvariablen. –

Verwandte Themen