Welche Datei soll ich als Argument für den Pfadnamen von ftok() übergeben?

Lesezeit: 4 Minuten

Benutzeravatar von Andrew-Dufresne
Andrew-Dufresne

Es wird im ftok()-Handbuch erwähnt

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

Die Funktion ftok() verwendet die Identität der Datei mit dem angegebenen Pfadnamen (der auf eine vorhandene, zugängliche Datei verweisen muss)

Ich bin verwirrt const char *pathname.

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

Wie wäre es, wenn ich benutze "/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 irgendwelche Probleme verursachen?

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

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

Vielen Dank für Ihre Zeit.

  • Besserer Weg für was? Zuverlässig wofür? – Vielleicht ist es besser, eine Aufgabe zu beschreiben, für die ftok verwendet werden soll?

    – pmod

    1. Juli 2010 um 6:14 Uhr

  • @Pmod: Eigentlich brauche ich eine Warteschlange, damit meine beiden Programme miteinander kommunizieren können. Was mich wirklich verwirrt hat, ist, welche Datei ich an ftok() übergeben soll, die immer vorhanden sein wird. Diese Antwort besagt, dass es in Ordnung ist, zu bestehen /etc . Wenn ja, warum übergeben die Leute dann andere Dateien? Ist es nicht einfach und besser, eine der Systemdateien zu übergeben?

    – Andrew-Dufresne

    1. Juli 2010 um 6:23 Uhr


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

    – pmod

    1. Juli 2010 um 8:04 Uhr

Benutzeravatar von paxdiablo
paxdiablo

Nun, im Allgemeinen würden Sie eine Datei verwenden, die der Anwendung selbst zugeordnet ist.

Zum Beispiel hatten wir eine Anwendung, die eine Konfigurationsdatei in den gemeinsam genutzten Speicher geladen hat (auf eine geparste, effizient zugängliche Weise – denken Sie an eine XML-Datei, die in In-Memory-Strukturen mit schnellen Zeigern usw. umgewandelt wurde), und wir haben den gemeinsam genutzten Speicher erstellt Abschnitt aus der ftok aus der Konfigurationsdatei selbst abgeleitet.

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, die Sie verwenden können /etc selbst bzw /tmp oder auch / wenn du musst.

Ich sage “wenn du musst”, weil es ein bisschen gefährlich ist. Das ftok call gibt Ihnen einen eindeutigen Schlüssel basierend auf Ihrer Dateispezifikation und Ihrer ID. Wenn Sie Ihre verwenden besitzen Datei wie z /etc/andrew.confkönnen Sie ziemlich sicher sein, dass Sie keinen Zusammenstoß mit anderen bekommen ftok-Schlüssel zurückgegeben.

Wenn Sie und alle anderen sich jedoch für die Verwendung entscheiden /tmp als Dateispezifikationsteil ist dann 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 wirklich eindeutigen Wert für meine Anwendung zu verwenden und dann einfach die ID für das bestimmte Ding zu verwenden, das ich erstellen möchte.

Also, wenn ich 27 Semaphore und 15 gemeinsam genutzte Speicherblöcke brauche, sie alles verwenden /etc/pax.conf als Dateispezifikation und die IDs von 1 bis 42 (und meine Anwendung weiß welche ID sich auf welches Objekt bezieht).

  • „Sie können verwenden /etc selbst bzw /tmp oder auch / wenn Sie müssen.” Ist es eine schlechte Idee? Wenn es erlaubt ist, warum haben Sie es dann nicht in Ihrer Anwendung verwendet? Das verwirrt mich. Wann können wir verwenden? /etc/hosts oder welche Systemdatei auch immer vorhanden ist, warum müssen wir nach anderen Wegen suchen? Bitte erklären Sie es. Danke

    – Andrew-Dufresne

    1. Juli 2010 um 6:11 Uhr


Wahrscheinlich ist es am besten, argv zu verwenden[0] einer Ihrer ausführbaren Dateien. Die Manpage sagt

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

Sie sollten also sicher sein, auch wenn Ihre ausführbare Datei manchmal über einen symbolischen Link oder so aufgerufen wird.

  • Sicher! Aber wie soll dann ein anderes Programm davon erfahren? Pfadname und proj_id sollten in beiden Programmen gleich sein, damit ftok() denselben Schlüssel generiert. Einer von ihnen verwendet argv[0] wie werden andere davon erfahren? Bitte ausführlich.

    – Andrew-Dufresne

    1. Juli 2010 um 14:09 Uhr

  • Die Idee von ftok ist, dass die beiden Programme gemeinsames Wissen teilen. Ich würde annehmen, dass sie die ausführbaren Namen voneinander kennen. Dann haben Sie den zusätzlichen Schlüssel, der hilft, mehrere Sitzungen derselben Anwendung zu unterscheiden. In jedem Fall müssen Sie dieses gemeinsame Wissen beim Start teilen, zB mit einer Umgebungsvariablen oder so.

    – Jens Gustedt

    1. Juli 2010 um 19:35 Uhr

Sie können ein Zeichen * für einen Pfad basierend auf einer Konfigurationsdatei oder einem Befehlszeilenparameter usw. dynamisch erstellen.

Übergeben Sie einfach dieses Zeichen * in die Funktion.

Verwenden “.” als erster Parameter. Es sendet das aktuelle laufende Verzeichnis an ftok.

1437260cookie-checkWelche Datei soll ich als Argument für den Pfadnamen von ftok() übergeben?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy