2017-02-01 7 views
-1

私のアプリケーションでは、私はCプロセスを作成して、プロセスが終了すると再生成されます。今、私は、プロセスが最初に(システム再起動後に)生成されるかどうか、つまり関数Xが呼び出されるか、または関数Yによってクラッシュ(ランタイム)後にプロセスが再生成されたかどうかを知る必要があります。呼び出されます。linuxで非永続ファイルを作成する最も良い方法は

コマンドmktemp()を使用して一時ファイルを作成しようとしましたが、再起動してもファイルが永続的に見えました。

これを行うにはどうすればよいでしょうか?

+0

ファイルに情報やデータストアがありますか? –

+0

@AndrewHenleファイルに情報がありません。ブート後に初めてプロセスが生成されたか、クラッシュ後に再生成されたかを調べる方法としてのみ使用されます。 – Manoj

+0

(create and)共有メモリセグメント。これらはプロセスの処理(またはクラッシュ)後も永続的ですが、再起動後も存続しません。 – wildplasser

答えて

2

mktempは、ファイルをデフォルトで/tmpに作成します。多くのディストリビューションでは、/tmpは永続的です(つまり、ディスクにバックアップされ、メモリバックアップされません)。

あなたが探しているのは、メモリバックアップマウントでファイルを作成することです。通常、これらはマウントされているtmpfsです。例えば、私のアーチのLinuxラップトップ上で、私のtmpfsのマウントは以下のとおりです。

$ 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) 

だからこのシステム上で、私は開くことができますし、ファイルへの書き込み/dev/shm//runに、彼らは私の記憶でバックアップされます、彼らはしませんブーツ全体にわたって持続し、アクセスは迅速かつ安価になります。

質問に戻ると、mktempが使用するディレクトリを変更できるようです。 manページを引用:

-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 - いくつかのより多くの事を:

  • これは、すべてのディストリビューションに依存します。他のディストリビューションではtmpfs/tmpにマウントすることができます。興味深いことに、/ dev/shmは、shm_openで作成された共有メモリオブジェクトが格納される場所です。
+0

実際に開発中のアプリケーションは、powerpcアーキテクチャを持つ組み込みアプリケーションです。システムがリブートするたびに/ tmpディレクトリ内のファイルを削除するスクリプトが実行されていましたが、これは実行されず、/ tmpディレクトリ内のファイル永続的。とにかく@Ezequiel Garciaの提案に感謝します。それはうまくいった:) – Manoj

+0

まあ、私はあなたが '/ tmp'をしたいものに依存すると思います。ディスクでバックアップされた一時記憶域が必要で、再起動時に一時的な記憶域を削除したいのですか?それでは。私の組み込みプラットフォームでは、 '/ tmp'にtmpfsをマウントしていますので、ディスクを使用しません(再起動時に何も削除する必要はありません)。 –

1

たとえば、 openを削除してからすぐにファイルを削除してください(unlink)。開いているのでファイルは引き続き利用できますが、ファイルが閉じられるとすぐに(closeで明示的に、またはプロセスが終了したときにOSによって閉じられるため)、存在しなかったようになります。

+1

私は、プロセスが既に生成されているかどうかを判断するために、別のプロセスがファイルの存在をチェックすることを考えていると思います。このスキームが動作するのを防ぐファイルを削除することによって... – fjardon

+0

考えられるのは、ファイルの存在は、ブート時の機能(質問する関数X wrt)を呼び出す必要があるのか​​、実行時関数を呼び出す必要があります。だから私はファイルに何かを書くつもりはない、私は単にその機能を呼び出す必要があるかどうかを判断するためにその存在を使用するだろう。 – Manoj

2

私はpersistent/tmpに問題はありません。タイムスタンプをチェックして、起動時間と比較することができます。エポックで

起動時間:エポックで

stat -c %Y /proc/1 

ファイルの作成時刻:それはディストリビューション固有のtmpfsの設定に依存しないため、

stat -c %Y filename.tmp 

は、このアプローチの最大の利点は、可搬性ある

+0

しかし、プロセスのクラッシュは予測不可能なので、プロセスが最初に生成されるか、クラッシュ後に生成されるかを判断するために、タイムスタンプの概念に依存しません。 – Manoj

+0

なぜですか?起動時間と作成時間の差が起動時間よりも長い場合は、それが再起動であることがわかります – Bruno9779

関連する問題