0

char デバイス ファイル "/dev/my_file" を作成する Linux カーネル ドライバーを作成しています。複数のユーザー空間アプリケーションopen()がこのファイルを処理し、ioctl提供された cmd を使用してアプリ固有のデータを登録します。IOCTL は、クリーンな終了を行うときに、アプリが自分自身を使用および登録解除できる登録解除コマンドも提供します (カーネル drv はアプリ データを削除し、メモリ割り当てを削除するなど)。ただし、実行後にアプリケーションが強制終了されopen()ioctlcmd. どのアプリが強制終了されたかをドライバーが検出し、アプリ固有のデータを削除するためのクリーンアップ タスクを実行する方法。.releasefunc ptr fromが呼び出され、ドライバーに通知されることは知っていstruct file_operationsますが、drv が強制終了された特定のアプリを見つける方法についてはわかりません。

ありがとうシータル

4

1 に答える 1

0

「アプリ」(またはプロセス) レベルでのクリーンアップは、ハンドラーを呼び出すプロセス コンテキストが.release()必ずしもハンドラーを呼び出したものと同じではないため、注意が必要.open()です。(たとえば、呼び出したプロセスがopen()子プロセスを fork して終了し、子プロセスをデーモン プロセスとして実行したままにすることができます。)

代わりに、「開いているファイルの説明」レベルでクリーンアップすることをお勧めします。open()呼び出しが成功するたびに、開いているファイルの説明が作成.release()され、その開いているファイルの説明への参照がなくなると、ハンドラーが呼び出されます。private_dataのメンバーを使用して、ハンドラーstruct fileによって割り当てられたプライベート データ構造を指すことができます。.open()その「オープン ファイル固有」のデータ構造には、デバイス固有のプライベート データ構造を指すメンバーを含めることができます。

実際の例として、「Comedi」サブシステムのカーネル コードで上記を実行しました。その.open()ハンドラーcomedi_open()( drivers/staging/comedi/comedi_fops.cstruct comedi_fileを参照) は(struct fileprivate_dataメンバーが指す) を割り当て、にはタイプ のデバイスのプライベート データへのstruct comedi_fileポインター (メンバー) が含まれます。の他のメンバーには、同じファイルの他の と共有されない「開いているファイルごと」に異なる情報が含まれています。割り当てられた by は、ハンドラーによって解放されます(いつか名前を変更する必要があります!)。devstruct comedi_devicestruct comedi_fileopen()struct comedi_filecomedi_open().release()comedi_close()comedi_release

于 2021-01-28T14:30:21.380 に答える