December 2006

ちょっと、おバカなタイトルで攻めてみる。

親プロセス以外が、プロセスの終了を通知してもらう方法はあるのか?
という話。

最初に聞いたとき、脊髄反射的に、いろいろあるよーーー。と思った
do_exit()を追うだけでも、

profile_task_exit()
profile_handoff_task()
proc_exit_connector()
security_task_free()

このぐらい見つかる。
んが、どいつもこいつも、task_struct終了時通知なので、スレッドが死ぬ度に通知が飛びやがるのである。

しかもexit処理はいくつも同時に走りうるので、通知関数で
thread_group_empty()やら tsk->signal->live==1 やらでチェックするのもウマくない
(チェックしている最中にどんどん状態が変わるから)

さて、どうしたものか


P.S
ところで、netlinkのプロセスの生成・終了を監視する機構って全然ドキュメントないんだけど、誰が何のためにいれたんでしょ??
需要があるかどうか分からんけど、今度手引書書こうかしらん


追記
待てよ・・・
profile_handoff_task()
security_task_free()
の2つは put_task_struct()から呼ばれているのだからして、
thread_group_leaderは必ず最後にPF_DEADに遷移する。の規則により
この2つでif(pid==tgid) と判定するだけかぁ??
今度試す。


追記2
KAMEさんから、すごく素朴な指摘をうけて、ああ、説明が足りんかったと反省。
もっと具体的に書く。

あるプロセスにスレッドが2ついたとする、それぞれのpid, tgidは以下


pid tgid
--------------------------
スレッドA 101 101
スレッドB 102 101


そうすると、上記Hookはプロセス終了時に2回呼ばれる(スレッドが2つあるから)
ところが、たとえば、profile_task_exit() でprintkデバッグしていると以下の2つのケースがありうる。

ケース1)
1.スレッドA profile_task_exit()
この時、tsk->signal->live==2
2.スレッドB profile_task_exit()
この時、tsk->signal->live==1

ケース2)
1.スレッドA profile_task_exit()
この時、tsk->signal->live==2
2.スレッドB profile_task_exit()
この時、tsk->signal->live==2

ケース2で何が起こっているかというと

1.スレッドA profile_task_exit()
この時、tsk->signal->live==2
2.スレッドB profile_task_exit()
この時、tsk->signal->live==2
3.スレッドA atomic_dec(tsk->signal->live)
4.スレッドB atomic_dec(tsk->signal->live)

のように、do_exit()が2つのスレッドでほぼ同時に呼ばれる事により、
(このような状態はdo_group_exit()を呼ぶだけで簡単に作り出せる)
Hook関数からは、signal->liveの参照カウンタが2->2->0と変化したかのようにみえてしまっている。と。

んで、POSIX的にはmain thread に対してpthread_exit()を呼ぶことはアリなので、そうするとmain threadが最初にdo_exit()で抜けてくるやもしれず、pid==tgidでは判定できず、かつ、参照カウンタも信用できず。うーむ。
というのがそもそもの悩みだったのですよ。

監視プロセスが1つだけなら、ユーザーランドからkill -0 で定期監視すればいいけど、おいらが作っているのはミドルウェアで、監視対象が100とか10000とか増えてくると定期監視はいまいちヤル気がしないというのもあって、カーネルから通知してくれる口はないものかしら。と思っていた。と
そういうわです。

分かりにくくてすいませんm(_ _)m
このエントリーをはてなブックマークに追加

読了。
#しかし、うちの近所の本屋は漫画の入荷が遅くていかんわ。あっという間に周回遅れになってしまう。


作中に出てきたクヌート王子はやっぱりクヌート大王だったりするのだろうか?

トルフィンを匿ったうちのお嬢さんがレイプされてたりするのがお茶目。 


どうでもいいけど、昔だれかがトルフィンの家系図公開してたの思い出した。
ので、一生懸命検索してた。こういうのって後から探すと本当に見つからない。
と、思ったら、鮎方さんの所だった。灯台下暗し


http://d.hatena.ne.jp/Ayukata/10010120

始めにオーディンあり。フリッグと結ばれる(共に北欧神話より)。

その子は(伝承上の)デーン王スキョル。

(中略)

 その子はスウェーデン王“指輪の”シグルド。アルフハイム出身の、ガンドルフ*2の娘アルフヒルドと結ばれる。

(中略)

 その子はスノーリ。トールヒルドと結ばれる。

 その子はトールズ。

 その子はトルフィン・カールセフニ。970年に生まれる。赤毛のエリクの義娘グドリッドと結ばれる。人を率いてヴィンランドへ移住する。



おおー
オーディンから始まって、デーン王、スウェーデン王とそうそうたるメンバーですな。

あっと、一応補足しておくと、上記サイトは別に漫画の同人設定をでっち上げてるサイトではなくて、実在するトルフィンの子孫(を自称する人)の家系図の転載しているわけですね。

↑むかし、真面目にPDFを読もうとしてノルウェー語に完敗した人




このエントリーをはてなブックマークに追加

読了。

喪服姿のホークアイ中尉がかわいい。


このエントリーをはてなブックマークに追加

http://shinh.skr.jp/m/?date=20061210#p05

型的には void* であってはいけないはず。標準のドラフトによると、

-4- The macro NULL is an implementation-defined C++ null pointer constant in
this International Standard (conv.ptr).*

[Footnote: Possible definitions include 0 and 0L, but not (void*)0. --- end
foonote]
だと。つまり 64bit でも NULL 使えば問題は起きないんだろうね。可変長引数のみ NULL 使って他は 0 使っておくのが無難って感じだろうか。




そういえば、昔、規格書PDFを買ったような・・・
と遠い記憶をたよりにごそごそと。

んで、出てきたのがこれ。
んーまあ、ほとんど変わってないね

オイラが見ている規格バージョンは以下ね
ISO/IEC14882 Second edition 2003-10-15
(Shinhさんの見てるのはいつのだ??)


関係しそうなところをいくつか抜粋


4.10 Pointer conversions [conv.ptr]

1 A null pointer constant is an integral constant expression (5.19) rvalue of integer type that evaluates to
zero. A null pointer constant can be converted to a pointer type; the result is the null pointer value of that
type and is distinguishable from every other value of pointer to object or pointer to function type. Two null
pointer values of the same type shall compare equal. The conversion of a null pointer constant to a pointer
to cv-qualified type is a single conversion, and not the sequence of a pointer conversion followed by a qualification
conversion (4.4).



18.1 Types

4 The macro NULL is an implementation-defined C + + null pointer constant in this International Standard
(4.10).180)



Annecx C(informative) Compativility

C.2.2.3 Macro NULL [diff.null]
1 The macro NULL, defined in any of <clocale>, <cstddef>, <cstdio>, <cstdlib>, <cstring>,
<ctime>, or <cwchar>, is an implementation-defined C + + null pointer constant in this International
Standard (18.1).




こうしてみると、null pointer は任意のポインタに変換できるintegral constant expressionと明記してあるので、intへの代入で警告を出すgccはグレーゾーンかも分からんね
(超便利なので否定する気はまったくないが)


追記:
ちなみに、禿げしゅとらうしゅとらっぷ先生の「プログラミング言語 第3版」だと
C++は型チェックが厳しいので、どのNULLマクロよりもただの0を使ったほうが問題が少ないと書いてあり、その下にオススメのNULL定義として

const int NULL = 0;

があげられています(-_-;

#まあ、あの本は先生の趣味で書いた本であって、実用を考えた本ではないらしいから。。
このエントリーをはてなブックマークに追加

通称「西田本」と呼ばれているアレだ。
後輩とかにぜひ読ませたかったので、満足。

会社でも同人誌って買えるのね(^-^)
もっとオカタイ会社かと思ってたよ
このエントリーをはてなブックマークに追加

イマドキのFedoraやらRHELやらだと、ブートのやたら早い段階でXが起動してくるけど、あれってrc script的にはどうなってるの?

ちょっと調べた感じではよーわからんかった。


いや、なに。
うちのXさんは酷使すると、すぐswapに逃避する現実逃避野郎なので、
mlockall でも仕込んでやろうかと思いましてな。

逃げちゃだめだ、逃げちゃだめだ、逃げちゃだめだ。。
このエントリーをはてなブックマークに追加

ということに、さっき気づいた。

気づいた理由が現実逃避にゲームをやろうとしたから。というのは秘密だだだ
#せっかくコサックス2買ってきたのに・・・


しかしアレだね。
パソコンが壊れるというのは、どうして、こうもwktkするかね。新しいのを買う言い訳を発見したというかww
このエントリーをはてなブックマークに追加

最近読んだ本シリーズ


結局いいたいのは


・日本はアメリカにとって(地政学的に)超重要な同盟だからそうかんたんには、切られない。もっと無理いってもヘーキ


・自衛隊には敵国に兵力を投入する能力が徹底的に欠けているので、自力戦争は無理。だから日米同盟重要だし、ぎゃくに近隣諸国にはこの事を明確につたえて日本脅威論を排除すべき


の二点だけなのかとオモタ。


データとかがすくないので、それ以上は著者の感想にすぎず、あまり意味ないかもしれん。


 



このエントリーをはてなブックマークに追加

↑このページのトップヘ