4つの共有メモリオブジェクトを作成するプログラムがあります。メモリ生成ルーチンは、生成を試みる前に呼び出され、プログラムは、shm_unlink()
実行の終わりに削除するために別のルーチンを呼び出します。shm_unlink()
今日、オブジェクト2-4(オブジェクト1ではない)を再作成しようとすると、「権限が拒否されました」というメッセージが表示されました。 Linux はfuser
これらすべてが同じプロセスに属していることを示しているため、削除できません。
私は行って/dev/shm
それをし、ls -l
2-4が私のsudoユーザーではなくrootユーザーが所有していることを発見しました。私はrootとしてログインすることがほとんどないので、rootがどのようにそれらを所有しているかわかりません。この問題を解決するために、rootとしてログインして手動で削除しました。
私の質問は:そのユーザーとしてログインせずに他のユーザー(rootなど)が所有する共有メモリオブジェクトをプログラムで削除する方法はありますか?chown
shmオブジェクトを呼び出して所有者を変更する方法はありますか?
答え1
ルートは、自分が所有する共有メモリ(または他のIPCエントリ)を削除できます。これを行うための実用的な方法が必要な場合は、rootとして実行してください。
そうしないと、プロジェクトの作成時または作成後にプロジェクトの権限を変更する必要があります。すべてのファイルシステムエントリ(ファイル以外の内容を含む)はPOSIX権限を使用するため、そのエントリを削除したユーザーがそのエントリに書き込むことができることを確認する必要があります(そして、そのエントリを削除したのと同じユーザーがそのエントリの上のディレクトリに書き込むできることを確認する必要があります)。
これを保証するあまり理想的な方法は、プロジェクト(およびその親ディレクトリ)を誰でも書くことができるようにすることです。もちろん、これは大きなセキュリティホールを引き起こすので、通常はお勧めできません。
実行中のプロセスがrootとして起動するか、通常のユーザーからrootに切り替えた場合、生成されたIPCエントリはrootユーザーが所有できます。これを行うプロセスを変更できる場合は、開始ユーザーではなくユーザーが削除できるように、適切なグループ権限を使用してプロジェクトを作成するプロセスを取得できます。