2009-08-03 6 views
5

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

ファイルサービングアプリケーションを作成している理由 - 呼び出し元のuid/gidが正しいユーザーに設定されていて、正しいファイル/ディレクトリが正しいuid/gidで作成されていない限り、ACLとクォータが強制されない

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

プロセス全体の '一貫性のある' UIDはPOSIX標準によるようですが、古いLinuxはPOSIXに従わず、異なるスレッドに対して異なるUIDを許可していました。新しいカーネルはPOSIXに従っているようですが、古い '壊れた'振る舞いを許可する方法はありますか?

答えて

5

setfsuid()/ setfsgid()がスレッド単位であるのか、プロセス単位であるのか確認しましたか?これらは、このユースケース(ファイルサーバー)用に特別に設計されています。

+0

これは優れています - 私はチェックして、驚くべきことに、それらが本当にスレッドごとであることを発見しました。これはおそらく好ましい方法でしょう。 しかし、私がテストしなかった理由は、quota()とaccess()が動作しないことです。他にもうまくいく - これはおそらくLinuxのバグです。 – ondra

+0

はい、sys_setfsuid()のカーネルコードのコメントに特にaccess()が記述されているので、バグのように聞こえます... – caf

+0

@Ondrej、 'fsuid'は以下のコードを投稿してください。他のUID/GID構成と異なり、スレッドごとであり、プロセスごとではありません。カーネルとglibcのバージョン、スレッド実装(NPTL、LinuxThreads、OndrejThreadsなど)も指定してください。 – pilcrow

5

スレッドを1つだけ変更するには、syscallを直接使用する必要があります。syscall(SYS_setresuid、...); libc関数setresuid()はすべてのスレッド(すべてのスレッドに送るsingalを使って)に対して同期させます!

関連する問題