APUEと言う
私たちは見ました原子演算の別の例は、open 関数の O_CREAT および O_EXCL オプションを記述するときに発生します。。これら 2 つのオプションを指定すると、ファイルが既に存在する場合はオープンが失敗します。また、ファイルが存在するかどうかを確認し、ファイルの作成がアトミック操作で実行されると述べました。このアトミック操作がなければ、試してみることができます。
if ((fd = open(path, O_WRONLY)) < 0) { if (errno == ENOENT) { if ((fd = creat(path, mode)) < 0) err_sys("creat error"); } else { err_sys("open error"); } }
この問題は、ファイルがオープンとcreatの間の他のプロセスによって生成された場合に発生します。これら2つの関数呼び出しの間に異なるプロセスによってファイルが生成され、他のプロセスがファイルに何かを書き込むと、この生成が実行されるとそのデータが削除されます。存在テストと生成を単一のアトミック操作にマージすることで、この問題を回避できます。
システムコールopen()がアトミックな場合にのみ参照は意味がありますか?
より一般的には、Linuxまたは他のオペレーティングシステムでは、すべてのシステムはアトミックタスクを呼び出しますか?
そうでなければ、システムコールがアトミックかどうかはどうすればわかりますか?
ありがとうございます。
ベストアンサー1
システムコールは成功または失敗するため、通常はアトミックです。失敗した場合は、「ロールバック」を実行し、呼び出し元にエラーを返す以外は何もしません。また、初期状態と最終状態の間の中間状態を、システムで実行されている他のスレッド/プロセスにさらさないようにするという点でアトミックです。たとえば、ファイルが作成されたか存在しません。
ほとんどの場合、これらのスレッド間(プロセス間)の原子性は実際には関係ありません。呼び出しはopen(path, O_WRONLY)
別のスレッドで独立して実行され、呼び出しスレッドから完全に非同期に書き込むためにファイルが開き、別のスレッドでファイルへの呼び出しを開いて閉じます[*]。したがって、参照の感度がopen
システムコールの原子性にどのように依存するかを理解していません。
[*]同時オープン呼び出しが多い場合は、カーネルだけでなく、ファイルを開くスレッド数を数える変数など、同時更新から独自の内部データ構造を保護する必要があります。