9

マルチスレッド プロセスで 1 つのスレッドのみの UID/GID を変更する方法はありますか?

この理由は、ファイル サービス アプリケーションを作成するためです。呼び出し元の uid/gid が正しいユーザーに設定されていない限り、ACL とクォータは適用されず、新しいファイル/ディレクトリは正しい uid/gid で作成されません。

通常、ネットワーク アプリケーションは最初に自分自身を fork() し、各ユーザー リクエストを個別のプロセスで処理します。共有データが必要な場合は、何らかの共有メモリを経由する必要があります。ただし、たとえば、FUSE (Linux ユーザー ファイルシステム) はデフォルトでマルチスレッドを使用し、Python バインディングと組み合わせてフォーク モデルを使用するのは現実的ではありません。

プロセス全体の「一貫した」UID は POSIX 標準に従っているようですが、古い Linux は POSIX に従っておらず、スレッドごとに異なる uid を許可していました。新しいカーネルは POSIX に従っているようですが、古い「壊れた」動作を許可する方法はありますか?

4

2 に答える 2

9

Linux 固有のsetfsuid()/setfsgid()は、プロセスごとではなくスレッドごとです。これらは、このユース ケース (ファイル サーバー) 用に特別に設計されています。

access()は引き続き実際の uid と gid を使用してアクセスをチェックすることに注意してくださいsetfsuid()/のsetfsgid()場合は、要求された操作を試して、その時点で権限がないために失敗したことを検出する必要があります。

于 2009-08-04T02:26:49.690 に答える
9

1 つのスレッドだけの uid を変更するには、syscall を直接使用する必要があります: syscall(SYS_setresuid, ...); libc 関数 setresuid() は、(すべてのスレッドに送信するシグナルを使用して) すべてのスレッドに対してそれを同期します!

于 2014-09-19T11:48:08.907 に答える