***すれ立てるまでもない質問はここで 第46刷***

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:03/11/23 17:53
ちょっと長くてすみませんが、よろしくお願いします。

サーバがクライアントから要求を受け取り、クライアントの所有者
基づいて、指定されたディレクトリにデータを書き出すものとします。
このとき、クライアントの所有者と、指定するディレクトリの
パーミッションが合わない場合は、データの出力を拒否したいとします。

さてサーバとしてはスレッドで動くか、fork()で動くかするわけですが、
要求を受け付けるまではrootで動いており、データを出力する前には
setuid()を呼ぶわけです。というか、なるべくセキュリティを考慮して
専用のユーザーに切り替わりたいわけです。

ただし、一旦setuid()するとrootに戻れないわけで、threadで動く
サーバだと他のスレッドに影響を与えてしまって都合が悪いと思います。
となると、このようなサーバはforkで作るしかないのでしょうか?
>>951
こいつと同列に見られても困るから、少し説明しとこうか。

>>930 は、MT ライブラリを使えばスレッドセーフにならんかと聞いてる。
だから俺は、MT ライブラリはライブラリの部分がスレッドセーフになるだけで、自分の書いてる部分がスレッドセーフになるわけじゃないと答えた。

例えば、malloc() なんかは、MT ライブラリを使わずにマルチスレッドで使うと、複数のスレッドからほぼ同時に呼ばれた時にメモリ管理領域を壊す可能性がある。
MT ライブラリを使えばそういうことはおきなくなる (はずである)。
これが、「ライブラリがスレッドセーフ」と言う意味。

でも

int i = 0;

void foo(){
 int j;
 for(j = 0; j < 10; j++){
  i++;
 }
}

と言う関数をふたつのスレッドで呼び出した結果 i = 20 にならないことがある。
これは上で話題となってた、i++ がスレッドセーフでないため。
(まあ、シングルプロセサならほとんど i = 20 になるけどな。)

当然こういうのは、MT ライブラリ使ってもなんともならない。
自分でクリティカルセクションでも使って保護するしかない。

これが、「あんたが書いたプログラムが自動的にスレッドセーフになるわけじゃない」と言う意味。

まともなプログラマなら、これぐらいは理解できているはずだと思うけどな。(藁
>>952
スレッドには、ユーザーの概念がない (と言うか、他のスレッドに対してメモリ保護もされないんだから、あっても無意味) ので、fork() でやるしかないと思う。
955952:03/11/23 18:12
>>954 レスサンクス。

やっぱそうでしょうね。スレッドだと、ミューテックスでクリティカルな
領域を保護してseteuid()〜ファイル出力、終わったらロック解除みたいな
あまり頭のよくないことをしなければだめでしょうね。
>>955
なんか勘違いしているような気がするけど...。
ミューテックスやクリティカルセクションてセキュリティとは (あんまり) 関係ないよ。
957952:03/11/23 18:33
>>956 
あるスレッドでsetuidを呼んだ次の瞬間、別のスレッドでrootに戻ったとか
したら、作成しようとするファイルのパーミッションがおかしくなるかも
しれませんね。

また、rootの時にバグって変なコードを実行させられたらまずいでしょう。
958947:03/11/23 18:38
>>953
>>930>>928を受けての発言だと思うんだけど。
>>953
そんなことは君が言うとおり誰でもわかってるんだけど。
ほんとウザい奴だなぁ。別のスレで暴れてくれよ。できればマ板で。
そう。953の言いたいことなど誰でも分かっている。
でもそれがおかしいんだよな。
お互い自作自演炸裂だね(プ
誰でもわかる自明な事柄を何十行もかけて延々と説明して、
いったい何を主張したいというのだろう、このアフォは。
ちょっとつつかれるとすぐ逆上して>>953みたいなレスするし。
つーか、コテハンでレスするようにしてくれよ。ローカルアボーンするからさ。
>>953
そのコードはスレッドセーフだぞ。
なんか勘違いしてるだろ。
>>953
そんなコードはありえない。
もうおなかいっぱい。
次スレではやめてくれるよな?
>963
マルチプロセッサのとき、スレッドセーフでは無い気がするが。
>>966
マルチプロセッサならコードを二重に実行するとか思ってんのか?w
>>953
おまえにはスレッドセーフライブラリが
全く理解できていない事が解った。
>>968
だから自分の意見を書けって。
お前の考えはお前が言わない限り分からない。
うざい人がいるので自分がうざいと思った場合は無視してあげてください
>>969
横やりだが

この例では経過はどうであれ結果は変わらない
よってスレッドセーフでないという結論にはならない
>>971
ほんとですか?
証明とはその過程があって初めて成立するものです。

証明に証明されていないあんたの頭の中の自分理論を適用している時点でばかげています。
誰か次スレ頼む
たぶん>>971は今ごろ、
「なんで俺の言うことを素直に聞かんのだ?
俺の言っているとは正しいのだ。
素直に信じていれば良いんだ。」とか
思っているんだろうな。
いったいいつまで誰が一番頭が悪いかを競ってるんだ?
>>966 を除いてマジでバカばっかりだな。(願わくば、自演 (=一人) であることを望むよ。)
特に >>967 なんて見てられないよ。

もう一回言っとくよ。
i++ は、スレッドセーフじゃねーよ。

信じられなかったら、Pentium のマニュアルで Lock プレフィックスを調べてみな。

まあ、お前らにはマルチプロセッサ上で動くプログラムなんか書く機会なさそうだから関係ないことだろうけどな。(ププッ
>>976
へぇ、i++ってアトミックじゃないんだ。

と、言うかiがローカルかグローバルかスタティックかも書かずにそんなこと言われてもなぁと思った。
>>976
i++はCPUで直接解釈できます。

と言うのが笑い所で良いんですか?
iがグローバルにせよ、スタティックにせよ趣旨は変わらない
ローカル?autoのことか?foo()の外で定義されてるから、
それはあり得ない。というか、それくらい分かれよ、、
>>972
日本語になっていない文章を書いてご満悦ですか?
>>978
i++ なんて、どうせ1命令になる (保証されてるわけじゃないけど、まあ普通はそうなる) から、割り込まれないと言うんだろ ?
だから、考えが浅いって言ってる。
シングルプロセサならそれでいいけど、わざわざマルチプロセサと言う条件つけてるだろ。
だから、Lock について調べて来いって言ってるんだよ。

ちなみに上でも書いたけど、Penitum である特定条件 (ミスアライメント) だったりすると、

#pragma pack(1)
struct {
 char dummy;
 int i;
} x = {0, 0};
int j;

foo(){
 i = 0xffffffff;
}

bar(){
 j = i;
}

で、foo(), bar() が異なるプロセサでほぼ同時に実行されると、j が 0 でも 0xffffffff でもない値になることがあるよ。

>>979
まあ、アフォはほっといてやれや。
まともな話になって、そういうところしか突っ込めなくなったみたいだからさ。(藁
なんでこいつLockについて説明しないんだ?
他人には厳しく、自分には甘く、か。

つーか、いい加減やめろって。お前が知識があることはよくわかったら、
スレを浪費するようなレスは次スレからはやらないでくれ。

質問したい奴が質問できない雰囲気になってるのにいいかげん気づけよ。
そもそも普通は書かないようなタコなコードで人を説得しようとするのが間違っとる。
誰もそんな糞コードは書かないよw
>>981
> シングルプロセサならそれでいいけど、わざわざマルチプロセサと言う条件つけてるだろ。
最初から Lock がどうとか言ってる奴しかマルチプロセッサという条件は付けてないけどな
「俺の知識はすごいだろ」
「アフォか、俺が知識のあるところを証明してやる」

ってのはいまどきはやらねーんだよ。yahooでも逝ってろ、ボケ
リロードすんなって(プ
知識はあるかどうかしらんが、説明能力はお互いゼロだわな。
でなかったらこんなにダラダラ続くはずが無い。
マルチプロセッサでプログラムすることが大衆的ならともかく
たまたま自分がやっているからといって稀な事例を引っ張り出してきただけの
オナニーっぽいな
>>982
>質問したい奴が質問できない雰囲気になってるのにいいかげん気づけよ。

部外者だが、構わなければ速攻でいなくなるタイプの厨房だと思うがどうか?
厨房に構う奴もまた厨房というわけだ。

>質問したい奴が質問できない雰囲気になってるのにいいかげん気づけよ。
になっている原因の一旦は正義感に燃えるお前がになっているんだよ。
日本語が下手な人間ばかりだな
> になっている原因の一旦は正義感に燃えるお前がになっているんだよ。
スレッドセーフなライブラリを使っても、自分が書いたコードがスレッドセーフでなければ
スレッドセーフな関数にはならない。(あたりまえ)

自分が書いたコードがスレッドセーフでも、スレッドセーフではないライブラリを使えば
スレッドセーフな関数にはならない。(あたりまえ)

自分が書く部分をどうやってスレッドセーフにするか議論したければ(というか議論する
ようなことじゃないんだが)、別スレでも建てて思う存分やってくれ。
みんななんだか必死やな。
連休なんだから違うことに時間を使ったほうがええんちゃうのん?
じゃあ暇潰しに1000もらう
次スレよろ↓
>>982
> なんでこいつLockについて説明しないんだ?
普通自分で調べりゃわかると思うけどな。
まあ、君みたいな奴もいるから、コピペしとくよ。
(読んでもわからんとか言うなよ。)

この命令は、このプリフィックスの後の命令の実行中、プロセッサのLOCK# 信号をアサートさせる ( すなわち、その命令をアトム命令に変える)。
マルチプロセッサ環境では、LOCK# 信号は、それがアサートされている間プロセッサが任意の共有メモリを独占的に使用できるよう保証する。

> お前が知識があることはよくわかったら、スレを浪費するようなレスは次スレからはやらないでくれ。

それを言うなら、>>963 とか >>967 みたいな自信満々のアフォを何とかしてくれ。

>>984
当たり前。シングルプロセサに Lock は関係ないからな。

>>985, >>988
まあ、誉め言葉と受け取っとくよ。

>>987
多分お前の理解力がないだけだ。
で、お前かお前みたいな理解力がない割には自信満々の奴が絡んできただけだろ。
マルチプロセッサなんて条件を出してきたのはおまえしかいないだろ
>>998
当たり前だろ。
知ったか厨をからかうためだからな。
ヴァカがいっぱい釣れて楽しかったよ。

俺も満足したし、誰かすっきり 1000 でもとってくれ。
子ね
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。