[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 05/09 16:30 / Filesize : 142 KB / Number-of Response : 667
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

UNIXプログラミング質問すれ Part8



1 名前:970 [2006/05/18(木) 18:56:16 ]
UNIXおよびUNIX clone環境一般のプログラミングに関する質問スレッド

前スレ
Part7 pc8.2ch.net/test/read.cgi/tech/1127373405/
Part6 pc8.2ch.net/test/read.cgi/tech/1116908090/
Part5 pc8.2ch.net/test/read.cgi/tech/1105723117/
Part4 pc5.2ch.net/test/read.cgi/tech/1095843584/
Part3 pc5.2ch.net/test/read.cgi/tech/1085930894/
Part2 pc5.2ch.net/test/read.cgi/tech/1055110889/
Part1 pc2.2ch.net/tech/kako/992/992057422.html

Part3のミラー
makimo.to/2ch/pc5_tech/1085/1085930894.html
Part2のミラー
makimo.to/2ch/pc5_tech/1055/1055110889.html


45 名前:デフォルトの名無しさん mailto:sage [2006/06/03(土) 12:38:55 ]
ファイルを標準入力にリダイレクトしたあとキーボードからの入力も受け付けたいのですが、openシステムコールでキーボードを開いたりって出来ませんか?
ちなみに最初からリダイレクトせずにファイルのほうをopenして読むというのは意図から外れてしまうのであしからず
どなたかご存知でしたらよろしくお願いします

46 名前:45 mailto:sage [2006/06/03(土) 12:40:18 ]
書き忘れていましたが環境はWindows2000をホストとしてVMWare Player上で動かしているVine Linux 3.2です

47 名前:デフォルトの名無しさん mailto:sage [2006/06/03(土) 12:48:48 ]
/dev/tty

48 名前:デフォルトの名無しさん mailto:sage [2006/06/03(土) 13:02:19 ]
>>45
ls | less のlessは、やっているよな。>>47の方法で。

49 名前:デフォルトの名無しさん mailto:sage [2006/06/03(土) 16:15:38 ]
おお、、これはよさそうなものが
>>47,48 さんありがとうございました

50 名前:デフォルトの名無しさん mailto:sage [2006/06/13(火) 19:59:12 ]
MTAにpostfixを使っている環境で、C言語のプログラムでメールを受信したいです。

はじめ、スプールファイルを直接読んで処理しようと思ったのですが、エンコード
やら、文字コード変換やら色々とややこしく、簡単な方法を模索しています。

POP3のライブラリとかあればと思ったのですが、ググッてみても出てきませんでした。
何かよいライブラリがありましたら、おしえてください。


51 名前:デフォルトの名無しさん mailto:sage [2006/06/13(火) 20:03:12 ]
何やりたいのかよくわからんけど、簡単にやるなら C でわなく perl あたりだと思う今日この頃。

52 名前:50 mailto:sage [2006/06/13(火) 20:47:20 ]
訳あってC言語なんですが、やりたいことはメールの内容を解読して、DB(ポスグレ)に
書き出すというプログラムです。
常に起動していて、スプールファイルにデータが書き込まれたときに処理を行います。

文字コード変換は、iconv()という関数で出来るらしいという情報は得ましたが、
デコード(ISO-2022JP/BASE64)処理ができる関数というのがまだみつかっていません。

POP3のライブラリとかあれば、自動的にやってくれると思っているんですが、
ないでしょうか・・・

53 名前:デフォルトの名無しさん mailto:sage [2006/06/13(火) 22:37:43 ]
base64くらい簡単なんだから取り敢えず自分で書いちゃえば?



54 名前:デフォルトの名無しさん [2006/06/13(火) 23:34:47 ]
このプログラムを高速化する方法を教えてください。よろしくお願いします。
#include<stdio.h>
main()
{
int i, j;
i=0;
while( i < 100){
j=2;
while( j < i){

if( i % j == 0)
break;
j++;
}
if( i == j)
printf("%d\n", i);
i++;
}
}



55 名前:デフォルトの名無しさん mailto:sage [2006/06/14(水) 01:00:00 ]
#include <stdio.h>
int main()
{
printf("2\n3\n5\n7\n11\n13\n17\n19\n23\n29\n31\n37\n41\n43\n47\n53\n59\n61\n67\n71\n73\n79\n83\n89\n97\n");
exit(0);
}

56 名前:デフォルトの名無しさん mailto:sage [2006/06/14(水) 01:03:56 ]
>>52
metamailのソースを窃盗しろ。

57 名前:デフォルトの名無しさん mailto:sage [2006/06/14(水) 02:05:28 ]
>>52
あえてbase64のためだけにglib

58 名前:デフォルトの名無しさん mailto:sage [2006/06/15(木) 03:08:55 ]
Segmentation faultなどで、プログラムが停止すると、
コアが吐かれますが、あれはどのように活用すればよいのでしょうか?


59 名前:デフォルトの名無しさん mailto:sage [2006/06/15(木) 03:14:56 ]
乱数表

圧縮率評価用サンプル


60 名前:デフォルトの名無しさん mailto:sage [2006/06/15(木) 03:45:48 ]
コアってのは、プロセスが死んだときのそのプロセスが使っていたメモリの内容。
デバッガに、死んだプログラムの実行イメージとともに与えることで、プロセス
死亡時の状況
・どういう経路でどの関数の何行目に到達して死んだのか
・そのときの各変数はどんな値だったか
が再現でき、死因を調べるのに使える。

61 名前:デフォルトの名無しさん [2006/06/15(木) 08:06:02 ]
素人でも出来ますか?

62 名前:デフォルトの名無しさん mailto:sage [2006/06/15(木) 08:44:56 ]
Unix系なら最低限adb程度のデバッガがある。
adbがあるなら、coreのあるディレクトリでadb <実行モジュール> として起動、
$c を入力すればスタック履歴が出るのでどの関数から呼ばれたどの関数から吐いたコアか判る(事も多い)。
但し、実行モジュールのシンボルが剥がされていると関数名が出ない。
#詳しくは手元のデバッガの使い方を調べてくれ。

63 名前:デフォルトの名無しさん mailto:sage [2006/06/15(木) 09:25:43 ]
>>60
> コアってのは、

コアダンプってのは、




64 名前:デフォルトの名無しさん mailto:sage [2006/06/15(木) 09:46:21 ]
>>60
> コアってのは、

ヨーグルト

65 名前:デフォルトの名無しさん mailto:sage [2006/06/15(木) 12:06:43 ]
>>63(笑)

66 名前:デフォルトの名無しさん [2006/06/15(木) 12:21:32 ]
pascalの文法には、変数名とか関数名の非終端記号があるらしんだけど
これはすべて名前(識別子)であって文法を簡単にするものであると。

原始プログラム中のその名前をみただけではどの名前であるか
判別できない。これの解決策はなにですか?


67 名前:デフォルトの名無しさん mailto:sage [2006/06/15(木) 12:25:45 ]
>>66
Ruby

68 名前:デフォルトの名無しさん mailto:sage [2006/06/15(木) 13:57:12 ]
>>62
Linuxとか*BSDならgdbもあるだろうしな。

69 名前:デフォルトの名無しさん mailto:sage [2006/06/15(木) 14:05:32 ]
>>66
冷たいようだが「宿題スレに行け」。

70 名前:デフォルトの名無しさん mailto:sage [2006/06/15(木) 16:33:56 ]
UNIX なら dbx!!

71 名前:デフォルトの名無しさん [2006/06/15(木) 18:35:45 ]
Linux上でブロードキャストメッセージを受信するプログラムを作成している者なのですが、
PCなどから送信したブロードキャストメッセージの信号にのってるMACアドレスを取得したく考えてます。

recvfromを使用しても、UDPデータ部しか見れなくて、困っているんですが、この場合、
RAWソケットを使用しないと、見れないものなのでしょうか?
また、RAWソケットを使用して、特定のポートのみをチェックすることって可能なのでしょうか?



72 名前:デフォルトの名無しさん mailto:sage [2006/06/15(木) 18:52:15 ]
>>71
IPレイヤから物理層レイヤのヘッダを把握してはいけません。
そもそもloやtunやpppやslipだったりしたらmacaddressなんて存在しないが?

73 名前:71 mailto:sage [2006/06/15(木) 19:06:42 ]
>>72
そのとおりですね。。。
想定として、LAN内のPCから受信するUDPメッセージのみを意識していたので、この書き方になってました。
もう少し、書くべきでした。

UDPメッセージの送信元MACアドレスを引く場合には、何か方法があるんでしょうか?
(MACアドレスを使用して認証みたいなことをしたいんで。。。)



74 名前:デフォルトの名無しさん mailto:sage [2006/06/15(木) 19:53:12 ]
linuxならPF_PACKETとか。libpcapのソース嫁

75 名前:デフォルトの名無しさん mailto:sage [2006/06/16(金) 00:09:51 ]
>>74
まあraw socketってことだよね。

MACアドレスは、NICによっては簡単に詐称する事できるので、
まじ認証をやらないように。

76 名前:50 mailto:sage [2006/06/16(金) 09:43:06 ]
みなさん、色々と情報ありがとうございます。
その後、nkfというコマンドがソース公開されてたので、これで出来ないかと
思っています。
サブジェクトのiso-2022-jpが変換できるか微妙ですが試してます。
ありがとうございました。


77 名前:デフォルトの名無しさん mailto:sage [2006/06/16(金) 13:42:43 ]
ちゃんとMIMEの仕様も読んだ方がいいよ。

メールをメールフォルダに取り込むのと、
メッセージを解析するのは全然別の仕事なんだけど、
その辺ちゃんと整理して理解出来ているのかね?


78 名前:50 mailto:sage [2006/06/16(金) 14:32:55 ]
>77
thx
今回は、一般的なメールクライアントではなく、特定業務のクライアントで、
送られてくる文字コードとかも決まっているし、メールをユーザに見せるわけ
でもないから、違うエンコードでメール本文解析できなかったらエラーにする
だけっす。

nkfでサブジェクトも本文も文字コード変換できますた。
あとは、こいつをファイルからではなく文字列を渡して変換かましてくれる
ようにするだけだだだ。


79 名前:デフォルトの名無しさん mailto:sage [2006/06/16(金) 14:36:18 ]
>>78
何故libiconvなりiconvプロセスなりを使わない?
OSによっては標準で入っているのだけれど。

80 名前:デフォルトの名無しさん mailto:sage [2006/06/16(金) 15:07:16 ]
>>79
一般論で横レススレ浮けど、iconv は不正な文字があると変換に失敗
してしまうから、いろんなクライアントから送られてくる怪しげなものを
処理するには向いていないと思う。

ある程度適当にやってくれる nkf の方がより向いているというか。

81 名前:デフォルトの名無しさん mailto:sage [2006/06/16(金) 15:39:10 ]
Structured fieldはQ encodingだからiconv()だけで解決するのは無理ざんしょ。

82 名前:71 mailto:sage [2006/06/16(金) 16:31:09 ]
>>72,>>74-75
レス有難うゴザイマシタ。

諦めて、UDPデータ内にMAC入れる事で合意を取る方向にします。

83 名前:デフォルトの名無しさん mailto:sage [2006/06/16(金) 16:50:33 ]
>>82
いや、だから MAC アドレスで認証したら駄目だって。




84 名前:デフォルトの名無しさん mailto:sage [2006/06/16(金) 19:17:01 ]
>>83
暗号化したデータ部に入れる方向(に変換)なので、大丈夫かなぁと。
心配オカケシマシタ。

85 名前:デフォルトの名無しさん mailto:sage [2006/06/16(金) 19:55:33 ]
認証*みたいな*ことならOKでしょ
疑いだしたらきりがない

86 名前:デフォルトの名無しさん mailto:sage [2006/06/16(金) 19:59:35 ]
>>55
ありがとうございます
ソースで10分の1、実行速度で6000分の1に短縮することが出来ました

87 名前:デフォルトの名無しさん mailto:sage [2006/06/16(金) 22:28:59 ]
というか、MACアドレスは常に外に晒されているわけで。
*みたいな*ことにも不適格。

88 名前:デフォルトの名無しさん mailto:sage [2006/06/16(金) 22:40:18 ]
いいじゃん。君が仕様決めるんじゃないんだし。

89 名前:デフォルトの名無しさん mailto:sage [2006/06/16(金) 23:04:58 ]
不適切なことをする自由は誰にもあるわな。

90 名前:デフォルトの名無しさん mailto:sage [2006/06/16(金) 23:06:55 ]
MACアドレス査証によるリスクと、MACアドレスを使わない場合の開発コストを天秤にかけて
妥当なほうを取ればええ。

91 名前:デフォルトの名無しさん mailto:sage [2006/06/16(金) 23:15:26 ]
どんな天秤だよ!
まずパスワード認証その他の認証方法と天秤だろw

92 名前:デフォルトの名無しさん mailto:sage [2006/06/16(金) 23:26:51 ]
MACアドレスを使いたいってことは、使用できる機器を制限したいってことじゃないか?
ID形式だとそれこそ詐称しまくられるリスクがある。
まぁ質問者じゃないから、なんともいえんが

93 名前:デフォルトの名無しさん mailto:sage [2006/06/16(金) 23:40:06 ]
>>92
君のレベルは問題外



94 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 00:07:08 ]
>>93
批判するなら具体的にやりましょう。

95 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 00:29:17 ]
> MACアドレスを使いたいってことは、使用できる機器を制限したいってことじゃないか?
「認証したい」って言ってるんだから明らかに自明なことを、
なんでそんなにしたり顔で言えるのか理解に苦しむ。

96 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 00:59:56 ]
>>95
質問者は認証したいとはひとことも言ってないが。

97 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 01:05:01 ]
それに質問者がどのようなものにMACアドレスを使いたいのかわからないが、例えばWebアプリケーションや、
クライアントサーバ型アプリケーションなら当然パスワード認証等も考慮するだろうし、それをしないとも
書いていない。

98 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 01:12:04 ]
DRM関連じゃないの?<MACアドレス
コンテンツのmove不可とか。

99 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 02:05:56 ]
なんか必死な奴は、どこかから仕入れた知識で、MACアドレスの偽装方法を知っていることを
自慢したいのでしょう。

100 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 02:59:26 ]
まぁ認証といっても、使用者の認証、ライセンスの認証、使用機器の認証といろいろとあるからな。

101 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 03:03:37 ]
>>96
>>73

102 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 03:07:06 ]
認証みたいなことをしたいんだろ。
つか、お前何が言いたいの?

103 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 03:09:56 ]
>>101
つか、この程度のニュアンスも汲み取れないんじゃ、プログラマやめたほうがいいよ。



104 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 03:16:06 ]
変なことで盛り上がるなよw

105 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 03:20:20 ]
からまれたもんで。

106 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 03:26:07 ]
まぁ>>91を見る限り、相手がNIU固定のファームかもしれないなんて想像もできないんだろうけど。

107 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 03:26:55 ]
お前しつこいよw

108 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 03:27:56 ]
うるさい。俺は徹底的にやるよ。
ガキは叩きのめす主義なんで。

109 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 03:29:38 ]
頓珍漢なこと言って諌められたからって切れなくてもいいのに

110 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 03:30:42 ]
具体的に指摘しなされ

111 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 03:31:42 ]
ひょっとして>>90のことか?
これが頓珍漢なことに見えるんなら、マジ相手にならんわ。

112 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 03:32:58 ]
必死だな

113 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 03:33:56 ]
まぁお前が.>>91なんだろうけど、逃げたいなら何も書かずにほっとけよ。追いかけないから。



114 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 03:38:20 ]
>>112
お前が>>91なら>>106に対するコメント書いとけ。俺もう寝るから。書かなくてほっといてもいいぞ。

115 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 03:40:01 ]
起きて監視しているんだろw

116 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 11:53:51 ]
教えて下さい!

finde ./ の結果が

AAA
AAA/BBB
AAA/BBB/hoge1.txt
AAA/BBB/hoge2.txt
AAA/BBB/hoge3.txt
AAA/BBB/CCC/hoge4.txt
AAA/BBB/CCC/DDD
AAA/BBB/CCC/DDD/EEE
AAA/BBB/FFF/GGG/hoge5.txt
AAA/BBB/FFF/GGG/hoge6.txt
AAA/BBB/FFF/GGG/HHH
AAA/BBB/FFF/III/hoge7.txt
AAA/BBB/FFF/III/JJJ
AAA/BBB/FFF/III/JJJ/KKK
AAA/BBB/FFF/III/JJJ/KKK/LLL
AAA/BBB/FFF/III/JJJ/KKK/LLL/MMM

となっていて、ツリーにファイルを持たないフォルダのみを
抜き出したいです。



117 名前:デフォルトの名無しさん [2006/06/17(土) 11:55:38 ]
↓こんな感じです。

AAA/BBB/CCC/DDD
AAA/BBB/CCC/DDD/EEE
AAA/BBB/FFF/GGG/HHH
AAA/BBB/FFF/III/JJJ
AAA/BBB/FFF/III/JJJ/KKK
AAA/BBB/FFF/III/JJJ/KKK/LLL
AAA/BBB/FFF/III/JJJ/KKK/LLL/MMM

先輩は、find . -type d -emptyと言い残して旅に出ましたが
動きませんでした…

OSはこれです。シェルがどうこうはよくわかりません。。。
SunOS devcvs01 5.9 Generic_118558-05 sun4u sparc SUNW,UltraAX-i2


118 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 12:38:14 ]
動くよ。

それに、それプログラミングじゃないだろ。
それから、その結果欲しければ、find AAA (ryだろ。

119 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 12:50:31 ]
シェルプログラミングスレどっかにあったな。UNIX板か?
実はSolarisのfindには-emptyオプションがないとか?
GNUとMac(BSD)にはあった。

120 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 13:25:45 ]
そのとーりSolarisには-emptyないよ

>>118
ぷw

121 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 13:41:01 ]
いかなる環境でも安定して動作し、
複数の計算機、複数の別プロセスから同時にアクセスされても安全が保障され、
複数プロセス間で、ロックを試みた順番で確実にロック権が回ってくる

そんな「完璧な」ファイルロックというのは可能でしょうか?
それとも、日本語の文字コードを完全には自動識別できないのと同じように、
ファイルのロックにも「完全」というのは存在しないのでしょうか?

ヒントやキーワードだけでいいから教えて下さい

122 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 14:05:27 ]
>>121
ヒント: スレ違い

123 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 16:49:41 ]
>>116
空のディレクトリを抜き出したい理由は?
カレント配下の空のディレクトリを消したいだけなら
find . -depth -type d -exec rmdir {} \;
でできるけど。
#-depthを指定しないと、例えばDDDを消そうとして失敗してからEEEを消すことになる。



124 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 17:02:27 ]
AAA/BBB/CCC/DDD/EEE
がファイルなのかディレクトリなのか区別出来ないけど

125 名前:デフォルトの名無しさん mailto:sage [2006/06/22(木) 05:41:18 ]
pthread使用していてgdbでデバッグしてるとepoll_waitが割り込みで何度も止まってるのよ
何のシグナル受け取ってるのか判別する方法ないかな

126 名前:ゆーき [2006/06/26(月) 00:07:54 ]
ハイパー初心者ですが、octaveでsubplotをファイルに保存したいのですが、print -depsや
gset term postscript enhancedではできません。。。
だれかやりかたを教えて下さい。お願いします。

127 名前:デフォルトの名無しさん mailto:sage [2006/06/26(月) 00:18:58 ]
>>125
OSを書け

128 名前:デフォルトの名無しさん mailto:sage [2006/06/26(月) 03:54:31 ]
epoll_waitと書いている以上、Linuxだろ?
straceで追っかけてみるのはどーだろ?

129 名前:デフォルトの名無しさん mailto:sage [2006/06/26(月) 12:59:50 ]
LinuxならSIGALRMじゃないの?

$(GLIBC)/nptl/*eintr*辺り読んでみて。

130 名前:デフォルトの名無しさん mailto:sage [2006/06/30(金) 03:23:01 ]
>>121
ありとあらゆる環境上でなんて事実上不可能

> 複数プロセス間で、ロックを試みた順番で確実にロック権が回ってくる

「ロックを試みた順番」という単語一つとっても

- ロックマネージャーに届いた順番?
- ロックにあたるFunctionを呼び出したとき?

など曖昧かと..
PostgreSQLなどのDBMSのソースとかがヒントになるかもしれない。

131 名前:デフォルトの名無しさん [2006/06/30(金) 14:01:44 ]
Linuxの一般のユーザーwatashiとtaninがいて、
watashiがtaninさんの/home/tanin/workのオーナーになりたいので、
こんなプログラムを作って、
int main()
{
int uid = 509;// watashiのuid
int gid = 100;// watashiのgid
chown("/home/tanin/work", uid, gid);
}
gccでコンパイルしたあと、ルートになって
chmod ug+s a.out
して、watashiユーザーで実行してみたのですが、失敗しました。
この方法では、watashiはtaninさんのディレクトリのオーナーになることはできませんか?


132 名前:デフォルトの名無しさん mailto:sage [2006/06/30(金) 14:25:35 ]
chown root a.out
したか?
setuidされたプログラムは、そのプログラムファイルの所有者
の権限で動くのであって、自動的にroot権限で動く訳ではない。

133 名前:デフォルトの名無しさん [2006/06/30(金) 14:28:01 ]
>chown root a.out
>したか?
ああ、その通りでした。忘れてました。
rootにchownしらた無事動きました。お騒がせしました。



134 名前:デフォルトの名無しさん mailto:sage [2006/06/30(金) 15:09:49 ]
>>131
chown()の返り値を調べてエラー処理をするように。

int result = chown(〜);
if (result != 0) {
perror("/home/tanin/work");
exit(1);
}

135 名前:デフォルトの名無しさん [2006/07/01(土) 23:34:34 ]
fork() で子プロセスを立ち上げるプログラムを書いてるのですが
(親プロセスは走り続けてイベントを待ち、時々 fork() して子プロセスに仕事をさせる)
子がシグナルを受けたときの親の wait() (wait4()) を呼ぶタイミングがわかりません。

親プロセスに SIGCHLD のハンドラをインストールしてその中で wait4() してみたの
ですが、 それだと子プロセスがゾンビになる場合があるようです。(うまくいく場合もある)
なお wait4() には WNOHANG をセットしてそこで親がハングしないようにしています。

シグナルハンドラ内の wait4() で駄目なときは、どうやらもっと後で wait4() を呼ぶと
うまく子プロセスが刈られるようです。
ただ、それは実験的に親のプログラムのいろんなところに wait4() を埋め込んだ
らゾンビが出ないのがわかっただけなんで、それでいいとは思えません。

こういうプログラムの場合 wait() ってどういうタイミングで呼べばいいんでしょうか。
あるいはタイミング以外に問題があるでしょうか。(ソースコードがないと厳しいかな?)
ちなみに OS は Mac OS X 10.4.6 です。

136 名前:135 mailto:sage [2006/07/01(土) 23:43:08 ]
あ、ちなみに wait4() を呼ぶときは WNOHANG かつ pid に -1 をセットして
ループで全てのプロセスを処理するようにしています。

137 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 23:51:23 ]
ハンドラ内で、signalがブロックされているうちに、
たくさん子プロセスが終了するけど、
ハンドラ終了のタイミングなどでループで全部処理しきれてない、
くらいしか想像付かない。

138 名前:デフォルトの名無しさん mailto:sage [2006/07/02(日) 00:05:12 ]
>>135
waitは基本的にSIGCHLDのシグナルハンドラで呼ぶ。
同タイミングで大量の子プロセスが死ぬ場合は問題になるのかも
しれないけど、俺はそんな経験nothing。

親プロセスが、子プロセスの死亡時に、プロセスを成就させる以外の
仕事をしないなら、forkを二回行って子プロセスを親プロセスのグループから
切り離すという手もある。
詳しくはUNIX Programming FAQ参照。

139 名前:135 mailto:sage [2006/07/02(日) 02:38:11 ]
どうも、早速のフォローありがとうございます。
>>137 >>138
そうですよね、基本はSIGCHLDのハンドラ内で wait() すればいいんですよね。

すいません、書き込みしたあともう少し調べてみたら、どうも状況によってシグナル
ハンドラが呼ばれない場合があるようです。なんとなく、子プロセスが大量にメモリを
使う処理をした後はハンドラが呼ばれていないような...
子プロセスは、同時に起動するのは1つだけです。
ps で見ると子プロセスのステータスは Z になっているんですが。

ちなみに sigaction() を使っているんですが、これって、一回ハンドラが呼ばれたら
また再インストールする、なんて必要はないですよね?
フラグは SA_RESTART だけを設定しています。

もしかして OS のバグ?
とりあえず動くものを作らないといけないので、さしあたり新たに fork() する前に
wait4() するようにしてゾンビの増殖は防げるようになりましたが... 気持ち悪い。

140 名前:デフォルトの名無しさん mailto:sage [2006/07/02(日) 03:21:20 ]
wait4が-1を返した時のerrnoもちゃんとチェックしてる?
死んだ子がいないと判断できるのはerrno==ECHILDの時だけだよ。
wait4が-1返しても、errnoがEINTRの時なんかは、まだ子が取り残されてる場合がある。

141 名前:デフォルトの名無しさん mailto:sage [2006/07/02(日) 09:07:35 ]
> もしかして OS のバグ?

こう思うときの99%は自分の理解不足が本当の原因。


142 名前:プログラミング [2006/07/03(月) 15:16:08 ]
誰かほんとにすいませんっ↓この問題分かる人教えてください!!
お願いします!(>△<)
言語はdelphiです。

?モンテカルロ法を使って1/3を求めるプログラムを作くれ。
 モンテカルロ法を試行する回数をプログラム実行時に選べるようにせよ。

?2分法を使って188の5乗根を求めよ。途中経過を分かりやすく画面に表せ。

143 名前:デフォルトの名無しさん mailto:sage [2006/07/03(月) 15:22:12 ]
問題がunix固有ではまるでない感じなので、Delphiのスレに行ったほうが
回答が得られやすいと思われるが、宿題は自分でやろうな。




144 名前:デフォルトの名無しさん mailto:sage [2006/07/03(月) 15:26:16 ]
>>143
作くれなんて問題の宿題があるか?

と思ったがあるみたいだ。

145 名前:プログラミング [2006/07/03(月) 15:30:08 ]
はいっありがとうございます!
delphiの掲示板いってみます(>▽<)☆






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<142KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef