2017-02-01 2 views
-1

In meiner Anwendung habe ich einen C-Prozess erstellt, die neu erstellt werden, wenn der Prozess stirbt. Jetzt muss ich wissen, ob der Prozess zum ersten Mal erzeugt wird (nach Systemneustart), aufgrund dessen die Funktion X aufgerufen wird, oder ob der Prozess nach einem Absturz (Runtime) aufgrund der Funktion Y neu generiert wurde wird angerufen werden.Was ist der beste Weg, um eine nicht-persistente Datei in Linux zu erstellen

Ich versuchte, temporäre Dateien mit dem Befehl mktemp() zu erstellen, aber die Dateien schienen auch nach dem Neustart persistent zu sein.

Also, was wäre der beste Weg, es zu tun?

+0

Gibt es Informationen oder Daten in der Datei? –

+0

@AndrewHenle Nein, es gibt keine Informationen in der Datei, es wird nur als eine Möglichkeit verwendet, um herauszufinden, ob es der Prozess nach dem Absturz zum ersten Mal nach dem Start oder neu erstellt wurde – Manoj

+0

(create und) anhängen a Shared-Memory-Segment. Diese sind nach Ablauf des Prozesses (oder Absturz) dauerhaft, überstehen jedoch den Neustart nicht. – wildplasser

Antwort

2

mktemp erstellt Dateien in /tmp (standardmäßig). In vielen Distributionen ist /tmp persistent (d. H. Disk-backed, nicht memory-backed).

Was Sie suchen, ist eine Datei in einem Speicher-Backed-Mount zu erstellen. Typischerweise sind dies die tmpfs Halterungen. Zum Beispiel auf meinem Arch Linux-Laptop, meine tmpfs Halterungen sind:

$ mount | grep tmpfs 
[..] 
run on /run type tmpfs (rw,nosuid,nodev,relatime,mode=755) 
shm on /dev/shm type tmpfs (rw,nosuid,nodev,noexec,relatime) 

So auf diesem System kann ich öffnen und Dateien in /dev/shm/ auf /run schreiben und sie werden von meinem Speicher gesichert werden, werden sie nicht über Stiefel hinweg bestehen und der Zugang wird schnell und billig sein.

Zurück zu Ihrer Frage, es scheint, dass Sie das Verzeichnis ändern können, das von mktemp verwendet wird. Unter Angabe der Manpage:

-p DIR, --tmpdir[=DIR] 
       interpret TEMPLATE relative to DIR; if DIR is not specified, use $TMPDIR if set, else /tmp. With this option, TEMPLATE must not be 
       an absolute name; unlike with -t, TEMPLATE may contain slashes, but mktemp creates only the final component 

EDIT - einige Dinge:

  • das ist alles Verteilung abhängig; andere Distributionen können tmpfs bei /tmp montieren.
  • Interessanterweise ist/dev/shm der Speicherort für gemeinsam genutzte Speicherobjekte, die mit shm_open erstellt wurden.
+0

Eigentlich ist die Anwendung in der Entwicklung eine eingebettete Anwendung mit powerpc Architektur .. einige Skripte mussten ausgeführt werden um die Dateien im/tmp Verzeichnis zu löschen, immer wenn das System neu gestartet wurde, was die Dateien im/tmp Verzeichnis verursachte beständig. Anyways danke für den Vorschlag @Ezequiel Garcia. Es hat funktioniert :) – Manoj

+0

Nun, ich denke, das hängt davon ab, was Sie wollen '/ tmp' zu sein. Sie möchten einen plattengestützten temporären Speicher, den Sie bei einem Neustart entfernen möchten? Dann gut. Auf meinen eingebetteten Plattformen mounte ich tmpfs auf '/ tmp', also benutze ich keine Festplatte dafür (und muss beim Neustart nichts entfernen). –

1

Erstellen Sie die Datei mit z. open, dann sofort die Datei entfernen (mit unlink). Da Sie es geöffnet haben, ist die Datei immer noch für Sie verfügbar, aber sobald sie geschlossen wurde (explizit mit close oder weil das Betriebssystem es beim Beenden des Prozesses schließt (Absturz oder nicht)), wird es so aussehen, als ob es nie existiert hätte.

+1

Ich denke, die Idee ist, dass ein anderer Prozess nach der Existenz der Datei sucht, um zu entscheiden, ob der Prozess bereits erzeugt wurde. Durch das Löschen der Datei verhindern Sie, dass dieses Schema funktioniert ... – fjardon

+0

Die Idee ist, die Existenz der Datei hilft mir nur festzustellen, ob die Boot-Zeit-Funktion (Funktion X in Bezug auf die Frage) aufgerufen werden muss oder die Laufzeit Funktion muss aufgerufen werden. Also werde ich nichts in die Datei schreiben, ich würde lediglich seine Existenz benutzen, um zu entscheiden, welche Funktion aufgerufen werden muss. – Manoj

2

Ich sehe das Problem mit persistent/tmp nicht. Sie können Zeitstempel überprüfen und sie mit der Startzeit vergleichen.

Boot-Zeit in Epoche:

stat -c %Y /proc/1 

Datei-Erstellungszeit in der Epoche:

stat -c %Y filename.tmp 

Der größte Vorteil dieses Ansatzes ist die Portabilität, da es nicht abhängig von Distro spezifischen tmpfs Einstellungen ist

+0

Aber der Absturz des Prozesses ist unvorhersehbar, kann sich also nicht auf das Timestamp-Konzept verlassen, um festzustellen, ob der Prozess das erste Mal erzeugt oder nach einem Absturz erzeugt wurde. – Manoj

+0

Warum nicht? Wenn der Unterschied zwischen Boot-Zeit und Erstellungszeit länger als ej 2 * Boot-Zeit ist, wissen Sie, dass es ein Respawn ist – Bruno9779

Verwandte Themen