私は、ユーザー空間のプロセス間通信のためにLinuxに存在するさまざまなIPCメカニズムについて学びました。
カーネルがLinuxでユーザースペースプロセスと通信する方法を尋ねたい(システムコールとは異なり、ユーザースペースは要求を開始します)。 Signalはそのうちの1つかもしれませんか?他のものは何ですか?
答え1
場合によっては、信号は一般的なカーネルプロセス通信です。もちろん、適切なUIDを持つすべてのプロセスを使用してkill()
シグナルを送信できますが、シグナルはSIGCHLD
ほとんどSIGWINCH
常にカーネルから来ます。
signalfd()
Linuxの場合は、システムコールを表示できます。一般的な信号処理は「アップコール」を介して行われるが、signalfd()
プロセスに従って信号を受信する様々な方法が提供される。
システムコールの戻り値は、カーネルとユーザー間のプロセス通信と考えることができます。これは大きな違いをもたらしますが、fork()
単なる例です。親プロセスは0以外のプロセスID(エラー時-1)を返し、子プロセスは0を返します。
poll()
システムコールには、select()
カーネルが使用可能なイベント/状態変更を含むファイル記述子を表すために値を設定するパラメータがあります。これは "inout"型パラメータと似ていますが、カーネルは値を設定します。
APIを使用すると、inotify
特殊ファイル記述子を介してカーネルとプロセス間の通信が可能になります。read()
マニュアルページを正しく読むと、POSIX非同期I / Oシステムには、I / Oが発生したときにスレッドを起動することを含む、ユーザープロセスと通信するためのいくつかの方法があるようです。私はPOSIX非同期I / Oを一度も試したことがなく、難しいようです。