68user's page 掲示板

Prev< No. 3079〜3132> Next  [最新発言に戻る] [過去ログ一覧]
No. 3079 # 68user 2003/01/29 (水) 02:28:50
>>3075 美春
考え方を変えて、日本語以外を除くとするなら
    % sed 's/[a-zA-Z0-9]//g' < file
など。本当に日本語だけを拾いたいなら
    http://www.din.or.jp/~ohzaki/perl.htm#JP_Match
を参考に perl でやるのがよいでしょう。

>>3076 山田
> cshellで文字列操作は可能なのでしょうか?
foreach file (AAA_*.txt)
    set date=`echo $file | sed 's/^AAA_\([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\).*/\1/'`
    echo '$file -> $date'
    if ( $date < '20020114' ) then
          echo $date
    endif
end

仕事や課題を丸投げされると答える側もつまらないです。質問するなら
もっとおもしろい質問をしてください。

お金を払っていただけるなら、(お仕事として) つまらん質問にも
答えますけど。

>>3078 koko
> 親プロセスで現在存在している子プロセスの数を把握
> したいのですが、簡単な方法はありますでしょうか。
簡単、というか適当な調べ方でよいなら、ps して、親プロセスが
自分であるプロセス一覧を取得、などがあると思いますが、
ps しているプロセスは除くとか余計な処理をしなきゃいけない
と思うので、結果的にはあまり簡単じゃないと思います。

    - 親がいろんな仕事をするのなら、fork するときに
        インクリメントして、SIGCHLD を受けるたびに
        デクリメント (>>2988 を参照)
    - 親は子の終了を待つだけなら、fork するときに
        インクリメントして、wait して、wait から戻って
        きたらデクリメント。

でいいんじゃないでしょうか。

No. 3080 # koko 2003/01/29 (水) 09:47:13
>>3079 68user
やはり、ご指摘の方法が妥当なところのようですね。
この方法で対応する事とします。
ありがとう御座いました。

No. 3081 # 山田 2003/01/29 (水) 09:59:35
>>3076 山田
ご回答ありがとうございます。
>仕事や課題を丸投げされると答える側もつまらないです。質問するなら
>もっとおもしろい質問をしてください。
了解しました。
先日、ほぼ一日調査してたのですが出来なかったもので。。。
申し訳ないです。。

No. 3082 # 美春 2003/01/29 (水) 11:49:51
>>3067 68user
うまくいきました。
本当にありがとうございました。
perlの方も挑戦してみます。
度々の質問で申し訳ありませんが、
grepの正規表現で"'"(シングルクォーテーション)
を出さないようにしたいのですが、
うまくいきません。
grep '[\']' <file>
だとダメみたいです。
どうすればよいのでしょうか?
初心者の質問ですみません。
よろしくお願いします。

No. 3083 # has 2003/01/30 (木) 00:01:24
>>3082 美春
grepは行単位で処理するので、シングルクォートを含む行を表示しない、
という処理は可能です。grepに-vをつけると、条件に合わない行のみを
出力するので、

% grep -v "'" filename

とすればfilenameファイル内のシングルクォートを含まない行のみを
出力してくれます。

もしシングルクォートを文字単位で削除したいのであれば、

% sed -e "s/'//g" < filename

とすればよいと思います。

No. 3084 # 美春 2003/01/31 (金) 14:06:07
No. 3083 has
感動してしまいました。
manで調べろと怒られるかと
思ったのにご丁寧に
ありがとうございました。

No. 3085 # 山田 2003/02/05 (水) 16:11:14
こんにちは、山田です。
shellにワイルドカードを含んだ引数を文字列として渡したいのですが上手くいきません。
例えば、
aaa.sh zz*.txt

aaa.sh zz\*.txt
と渡すとローカルにある対象となるtxtファイルを全て引数としてもってきてしまいます。
aaa.sh zz'\''*'.txt
などとしてもダメなようです。
出来ないのでしょうか?
申しわけありませんが、教えて下さい。

No. 3086 # ふくし 2003/02/05 (水) 16:19:59
>>3085 山田
さん、

シェルはなんでしょうか?
zsh だと

    > echo *.txt
    aaa.txt bbb.txt ccc.txt

    > echo '*.txt'
    *.txt

のようになりました。

No. 3087 # 山田 2003/02/05 (水) 18:33:15
>>3086 ふくし
様、ご回答ありがとうございます。
cshです。
やりたいことは、
aaa.sh ZZ*.txt
と指定した時にshell内で、
set filename = arg[1]とし、
filenameに"ZZ*.txt"という文字列をセットしたいのです。

No. 3088 # ふくし 2003/02/05 (水) 20:05:51
>>3087 山田
さん

下で書いたつもりだったんですが (^^;;;
引数「ZZ*.txt」全体をシングルクォート '' で囲んだらどうなります?

No. 3089 # 山田 2003/02/05 (水) 21:20:34
>>3086 ふくし

>引数「ZZ*.txt」全体をシングルクォート '' で囲んだらどうなります?
やはりカレントの該当するファイルが引数に入ってしまいます。
arg[1]の内容が"ZZa.txt ZZb.txt ZZc.txt"というような感じです。
んー、こまっております(^^;)

No. 3090 # 68user 2003/02/05 (水) 21:48:17
>>3089 山田
    % cat hoge
    set filename='*.c'
    echo $filename

    % csh -fx hoge
    set filename=*.c
    echo *.c
    a.c b.c c.c d.c

というわけで、csh では ただの文字列として set しても、
glob 展開されます。よって、参照するたびに
    echo "$filename"
とダブルクォートで囲むか (面倒)、あるいは
    set noglob
で変数を展開しないようにする、と。

もっとよいのは perl や ruby などに乗り換えることです。

No. 3091 # ふくし 2003/02/06 (木) 02:29:54
>>3089 山田
さん、

知らぬこととはいえ失礼しました。
そんな致命的な非互換があろうとは、、。

シュバング行で
  #! /bin/sh
と書いてしまって、Bourne Shell で書き直すってのは
どうでしょうね。
コマンドを手入力するのは csh 系が、
シェルスクリプトを組むのは Bsh 系がいいって聞いた気がします。
(気のせいか? ;;;
もっぱら私はちょっとでも論理のあることは
Perl にするのでどっちも知りませんが、、。

No. 3092 # op 2003/02/07 (金) 00:33:46
始めましてopといいます。
・・・いきなり質問で申し訳ないのですが、

掲示板を作っていて
コメントを書き込んだ後に更新をすると、
前のコメントが追加されてしまいます
これを回避する為にはいったいどんなコードに
書けがよいのでしょうか?

宜しければアドバイスの程お願いします。

No. 3093 # DQN..cc [URL] 2003/02/07 (金) 00:48:48
>>3092 op
書き込み後に↓こんなHTMLを表示すればいいのでは。

<html><head><title>書きこみました。</title><meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"><meta content=5 http-equiv=refresh></head><body>書きこみが終わりました。<br><br>画面を切り替えるまでしばらくお待ち下さい。<br><br></body></html>

別のページに移動させたければ、
<meta content=5 http-equiv=refresh>
ではなく、
<meta content=5;URL=../homepage/index.html http-equiv=refresh>
としてみる。

・・・といった方法ではどうでしょう。

No. 3094 # しん 2003/02/07 (金) 13:59:17
以前にBASIC認証の質問のご回答を頂きありがとうございました。
おかげさまで認証を行うサイトへのアクセスが出来るようになりました。
現在はPOSTが行えるクライアントを作成中です。

POST及びchunkedに関する質問ですが、
あるサイトにアクセスした際に

Content-type: text/x-hdml; Charset=Shift_JIS
Transfer-Encoding: chunked
省略
postmethod="post" postdata="xxxxxxx"
省略

とのレスポンスがあり

print SOCKET "POST /$path HTTP/1.1\r\n";
print SOCKET "Host: $host\r\n";
print SOCKET "User-Agent等リクエストヘッダ"

$message = "xxxxxxx";
$len = length($message);
print SOCKET "Content-length: $len"."\r\n\r\n";
print SOCKET "$message";

にてPOSTを行っているのですが、POSTされません。
原因としてはどういった事が考えられますでしょうか。
chunkedでエンコードされ送られたデータはPOSTする際もchunkedで
エンコードして送り返さなければいけないのでしょうか。
もしエンコードしたデータをPOSTしなければいけない場合はchunkedの
エンコード方法をお教え下さい。
宜しくお願い致します。

No. 3095 # op 2003/02/07 (金) 20:13:36
>>3093 DQN..cc様
早速のレス有難う御座います♪

なるほど・・・。
確かにこういった処理をする掲示板なんどか見かけた事がありました
本来の意味はこういう事?だったのですね(多分

それと、また質問で恐縮なのですが
リフレッシュ以外にも他の方法なんかありますかね?(^^;

No. 3096 # has 2003/02/08 (土) 01:37:29
>>3095 op
ここの掲示板では書き込みのたびに書き込み内容のMD5を作成し、
キャッシュしておいた最新数件分のMD5と同一の場合には記録しない、
という方式を採用しています。

詳しくはここの掲示板のソースを参照してみてください。

No. 3097 # H-Hash [URL] 2003/02/09 (日) 01:14:35
>>3094 しん
>chunkedでエンコードされ送られたデータはPOSTする際もchunkedで
>エンコードして送り返さなければいけないのでしょうか。
そんなことは無いです。

>もしエンコードしたデータをPOSTしなければいけない場合はchunkedの
>エンコード方法をお教え下さい。
要するにデータを細切れ(例えば1024byte毎)にして、
サイズ(16進)
データ
サイズ(16進)
データ

0
とすればいいだけです。(see http://www.studyinghttp.net/rfc_ja/2616/sec3.html#sec3.6.1)

で、解決方法ですが、とりあえずHTTP/1.0で送ってみて下さい。
それでも失敗した場合は、とりあえずチャンク周りが原因ではありません。

No. 3098 # op 2003/02/09 (日) 01:44:52
>>3096 has様
MD5ですかぁ〜レベルが一気に上がったような気がしますが、
これからさっそく勉強していきたいと思います(苦笑

ほんとにhasさん、DQN..ccさん有難う御座いました。

No. 3099 # ふくし 2003/02/13 (木) 19:18:56
Linux User という本に5つのディストリビューションが一気に
付録についてるので慌てて買ったんですけど、
よく考えるとコレ(よく考えなくても)CD じゃなくて
DVD なんですよね、、。
会社で遊んでるマシンが1個あって、ただし会社のマシン管理のヒトが
バックアップしてくれないから、バックアップデバイス兼ねて
この機会に DVD-RAM を入れようかなあと思ったんですが、
Linux で読める DVD-RAM ドライブってあるんでしょうかね。
じっさいにはネットワーク経由で Debian(woody)を入れたので、
もう雑誌の付録は必要なくなったんですが、、

No. 3100 # 68user 2003/02/15 (土) 02:44:18
>>3099 ふくし
> Linux で読める DVD-RAM ドライブってあるんでしょうかね。
FreeBSD でも DVD-RAM を読み書きできるくらいですから、
できなくはないでしょうけど、具体的な機種名などは
わかりません。

検索すると DVD-RAM 対応カーネルパッチが云々などと
いうのが引っかかるのですが、Linux 事情に疎いので
それが最新の情報なのか判断できないです。

# てゆーか、DVD-RAM どころか CD-R さえ使ったことが
# ないので。

No. 3101 # bebe 2003/02/17 (月) 11:23:45
findコマンドについて教えてください。
find . -user root とするとカレントディレクトリ以下の
所有者がrootになっているファイルが引っかかるかと思い
ます。
それではなくて、所有者がrootになっていないファイルを
引っ掛けたいと思うのですが、その場合findコマンドはどの
ように使えばいいでしょうか?
宜しくお願いします。

No. 3102 # 68user 2003/02/17 (月) 19:54:30
>>3101 bebe
> 所有者がrootになっていないファイル
    % find . ! -user root
    % find . -false -user root
    % find . -not -user root
などなど。

FreeBSD 4.7-RELEASE のマニュアルには ! と -false と -not が
書いてあるのに
        % find . -not -name \*.c
        find: -not: unknown option
となってしまう。なぜだろう。ソースを見ると -not は効きそうなんだけれども。

http://www.jp.freebsd.org/cgi/cvsweb.cgi/src/usr.bin/find/option.c
http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&man=find&dir=jpman-4.7.0%2Fman

No. 3103 # wataru [E-mail] 2003/02/18 (火) 14:45:54
send()について教えてください。

send()にてデータを送信しようとするとperrorにて「Illegal Seek」
と返ってきます。もちろんデータも送信できていません。

この現象の原因と対処法を教えていただけないでしょうか?
socketとconnectはできています。

No. 3104 # 68user 2003/02/18 (火) 15:02:41
>>3103 wataru
> Illegal Seek
ってことは errno が ESPIPE なのでしょうけれど、手もとにある FreeBSD と
Solaris2.6/8 を見ても、send(2) が ESPIPE を返すとは書いてありませんので、
わかりません。

てゆーか、OS 名も、OS のバージョンも、エラーの起こるコード例も提示せず
質問している、あなたという人間がわかりません。

No. 3105 # wataru [E-mail] 2003/02/18 (火) 16:09:42
ご無礼大変申し訳ありませんでした。現在私はHard Hut Linux2.0
でプログラムを組んでいます。

原因のソースコードは以下の様です。

    if ((*s = socket(AF_INET, SOCK_STREAM, 0)) < 0) { // TCPでソケットを開く
        perror("socket");
        s_vMsgSnd(TSK_ER , 71 , 40);
        return -1;
    }
    syslog(LOG_DEBUG,"s = %d",*s);
    syslog(LOG_DEBUG,"port = %d",port);
    
    // 接続に必要な情報を設定する
    memset((char *) &server, 0, sizeof(server));
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = dst_ip; //<GT_0010>
    server.sin_port = htons(port);

    s_vSigTimer(TIMER_START);
    alarm(TIMEOUT_SEC);
        if (connect(*s, (struct sockaddr *) &server, sizeof server) < 0) { // サーバとのコネクションを確立する
            perror("connect");
            s_vSigTimer(TIMER_STOP); return -1; //<GT_0003> add
        }
        s_vSigTimer(TIMER_STOP);
        signal(SIGPIPE,ReCNCT);
        if(usCnctNG == FLAG_ON)
            return -1;

上記の方法でconnectまで持っていきます。
その後

    while(sendbytes < MaxLENGTH){
            nSended=send(*s,psz,strlen(psz),0);
        if(nSended == -1){
            perror("SendError:"); s_vMsgSnd(TSK_ER , 71 , 57);
            s_vSigTimer(TIMER_STOP);return -1;
        }else if(counttim > 0){
            syslog(LOG_DEBUG,"+*+*+*+*time over +*+*+*+*");
            s_vSigTimer(TIMER_STOP);return -1;
        }
        psz+=nSended;
        sendbytes+=nSended;
    }

でMaxLENGTHに達するまでデータを送信します。

No. 3106 # bebe 2003/02/18 (火) 17:32:36
>>3102 68user
解凍有り難うございました。
        (1)% find . ! -user root ⇒うまくいきました。
        (2)% find . -false -user root
        (3)% find . -not -user root

(2)(3)は、ダメでした。オプションエラーになってしまいます。
でも、(1)だけでも使えればとりあえずはOKなので、重宝しています。

赤色の文字は 「Windows 機種依存文字」か、いわゆる「半角カナ」です。 この掲示板では自動変換されますが、今後は使用しないで下さい

No. 3107 # 68user 2003/02/18 (火) 20:56:27
>>3105 wataru
> Hard Hut Linux2.0
Embedded ですか (Hut じゃなくて Hat ですね)。この OS の存在を
初めて知りました。

    http://www.linux.or.jp/JM/html/LDP_man-pages/man2/send.2.html
の内容が正しければ、Linux の send(2) は ESPIPE を返しません。

ただし開発元がカーネルに手を入れている可能性があるので
Hard Hat Linux の send(2) は ESPIPE を返すのかもしれません。
マニュアルに send(2) がどういうときに ESPIPE を返すか書いて
ありませんか?

# まぁライセンスは GPL でしょうから、最悪ソースを読めばわかる
# わけで。

あと、
>>3105 wataru
のソースを眺めましたが、間違いらしきものは見付けられませんでした。

ただ、TCP では普通 send(2) は使いません。別に使っても構わない
はずですが、埋もれているバグを踏まないという意味では、素直に
write(2) を使った方がよいと思います。ただ、それで直るかどうかは
わかりません。

あとは、マルチスレッド環境なので errno の値が別のスレッドに上書き
されたとか…(多分違うと思いますけど)。

No. 3108 # 68user 2003/02/18 (火) 23:02:18
>>3102 68user
> ソースを見ると -not は効きそうなんだけれども。
そっか。

options はソートされていることが前提なのに (bsearch(3) に渡すから)、
        { "-nouser",c_nouser,f_nouser,0 },
        { "-not",c_simple,f_not,0 },
の順で並んでいるからか。

# http://www.jp.freebsd.org/cgi/cvsweb.cgi/src/usr.bin/find/option.c?rev=HEAD

No. 3109 # wataru [E-mail] 2003/02/19 (水) 14:13:27
ありがとうございます。
大変もうしわけありませんが、もう一つ教えていただけないでしょうか?

SSLでの通信も行っているのですが、SSL_write()を使用する際に
タイムアウトの時間を設定したいのですが、方法がわかりません。

selectを使えばできるとも聞いたのですが、具体的にどうすればよいでしょうか

ソースは以下の様です。

    MaxLENGTH = strlen(psz);
    while(sendbytes < MaxLENGTH){
        syslog(LOG_DEBUG,"Send");
        nSended = SSL_write(SOKET, psz, strlen(psz));

        if(nSended == -1){
            perror("SendError:"); s_vMsgSnd(TSK_ER , 71 , 57);
            return -1;
        psz+=nSended;
        sendbytes+=nSended;
    }
    return 0;
}

お手数ですがよろしくお願いします。

No. 3110 # wataru [E-mail] 2003/02/19 (水) 14:15:38
ESPIPEの件は、また別のところで起こっていたようです。
仰る通り、sendによるものではありませんでした。
お手数をおかけしました。

No. 3111 # ふくし 2003/02/19 (水) 23:22:06
そういや(質問でも答でもなく雑談ですが、いいんですかね)
せっかく自分のサーバー立てたんだから、XML::DOM 入れてみよう!(^^)

No. 3112 # 68user 2003/02/21 (金) 22:22:21
>>3110 wataru
> ESPIPEの件は、また別のところで起こっていたようです。
しょーもないミスですが、ありがちですね。

>>3109 wataru
> SSLでの通信も行っているのですが、SSL_write()を使用する際に
> タイムアウトの時間を設定したいのですが、方法がわかりません。
使ったことはありませんが、
    http://www.openssl.org/docs/ssl/SSL_CTX_set_timeout.html
とか、
    http://www.openssl.org/docs/ssl/SSL_get_fd.html
でディスクリプタを取得して select とか、あるいは単純に
alarm とか、でしょうか。

No. 3113 # Japper 2003/02/24 (月) 00:01:36
こんばんわ
CGIのフォームメールで添付ファイルを送っているのですが
途中で通信を中止すると
サーバー上にファイルが残ってしまうということに悩まされています

そのフォームメールはQMAILを用いてメールを配信しています
POPサーバーはVPOPMAILです

対処法はなにかありますでしょうか?

No. 3114 # 68user 2003/02/24 (月) 17:27:34
>>3113 Japper
シグナルをキャッチするという方法もありますが、単にファイルを
消したいだけなら
    - 送信し終わったらファイル名をリネーム or ファイルの置き場所を
        変える (mv)
    - フォームメールが起動したとき、リネーム前 or 実行途中の置き場所
        にあるファイルで、タイムスタンプが古いものを消す。
が単純でよいと思います。

No. 3115 # koko 2003/02/24 (月) 19:36:35
親プロセスでFILE* fpに対してファイルをオープンします。
その後、forkで子プロセスを生成し、子プロセスですぐにfclose(fp)を行います。(子プロセスではファイルを使用しない為。)
子プロセスでファイルをfcloseした後、親プロセスでは引き続きfpに対して読み込みや書き込みを行えるでしょうか。
ファイルディスクリプタは、子プロセスで閉じても親プロセスに影響無いようですが、ファイルポインタは共有されている(?)様なので影響がありそうな気がするのですが、いかがでしょうか。
■知りたい事
1.最終的に親と子でそれぞれfclose(fp)を行う必要があるか。
    (開いたものは必要であれば明示的に閉じるようにしたい。)
2.子プロセスでfcloseしても、親プロセスのfpに影響がないか。

よろしくお願い致します。

No. 3116 # 68user 2003/02/24 (月) 19:55:02
>>3115 koko
> 1.最終的に親と子でそれぞれfclose(fp)を行う必要があるか。
> 2.子プロセスでfcloseしても、親プロセスのfpに影響がないか。

fork したときの出力用バッファにデータがたまっていれば、子の
fclose でバッファがフラッシュされます。そこで親も fclose すれば
同じ内容のバッファがファイルに出力され、同じ内容のデータが
2回書かれることになります。

なお fclose(3) しなかったとしても、exit(3) すれば結局は fclose されます。
# _exit(2) ならされません。

よって、
    1. fflush(fp)
    2. fork
    3. 子は fclose (*A)、親は引き続き fp を使う
がよろしいかと。

*A は、してもしなくても変わりませんが、子で使わないという
意志を明確に示すために fclose(3) した方がよいと僕は思います。

No. 3117 # koko 2003/02/24 (月) 20:56:21
>>3115 koko
早速回答頂き、ありがとうございます。
動作を確認しましたところ、fflushしないと二重でデータが書き込まれていました。
fflushして回避する事にします。
もうひとつ、教えて頂けますでしょうか。
FILE*ではなく、ファイルディスクリプタに対してopen、write、closeで同じ事をした場合、ファイルディスクリプタはバッファリングされないのでfflushのような事をしなくても二重書き込みにはならないでしょうか。
実は、FILE*とファイルディスクリプタの両方を使用して同じ事をしている為、ちょっと心配になりました。
実動作を見た限りでは、ファイルディスクリプタは二重で書き込まれていない様なので大丈夫だとは思いますが...。
よろしくお願い致します。

No. 3118 # koko 2003/02/24 (月) 20:58:35
>>3316 tomotomo
No.3317は>>3316の間違いです。
すいません。

No. 3119 # 68user 2003/02/24 (月) 21:34:23
>>3117 koko
> ファイルディスクリプタはバッファリングされないのでfflushのような事を
> しなくても二重書き込みにはならないでしょうか。
されません。低レベル入出力システムコールはバッファリングが
ないので大丈夫です。

No. 3120 # koko 2003/02/24 (月) 21:36:31
>>3119 68user
回答頂き、ありがとうございます。
安心しました。

No. 3121 # Japper 2003/02/25 (火) 20:32:23
>>3114 68user
ご回答ありがとうございました
大変助かりました

さて、findコマンドでファイルを検索をかけていますが
大きいファイル順に並べ替えるなど
そのようなことはできないでしょうか?

No. 3122 # koko 2003/02/25 (火) 22:59:54
C言語のプログラムでsystem関数でプログラムを呼び出します。
引数に存在しないプログラムを指定した場合のsystem関数の戻り値が-1になる時と256になる時があります。
256の時は、上位8ビットが1なのでシェルのexitコードが1のような気がするのですが、何も環境を変えていないのに戻り値が-1や256に変わる理由が思い浮かびません。
何度も繰り返していると-1と256が不規則に交互します。
この情報だけで何か分かりますでしょうか。
よろしくお願いします。

No. 3123 # 68user 2003/02/26 (水) 01:40:04
>>3121 Japper
> さて、findコマンドでファイルを検索をかけていますが
> 大きいファイル順に並べ替えるなど
大きいってファイルサイズのことですか?
もしそうなら find . -ls | sort +7 とか。

>>3122 koko
> system関数の戻り値が-1になる時と256になる時があります。
FreeBSD の system(3) がおっしゃるには
          The system() function returns the exit status of the shell as returned by
          waitpid(2), or -1 if an error occurred when invoking fork(2) or
          waitpid(2). A return value of 127 means the execution of the shell
          failed.
だそうです。

No. 3124 # koko 2003/02/26 (水) 09:49:46
>>3123 68user
確かに、私が調べたところでも同じ事が記述されていました。
試しに簡単なmainを作って存在しないコマンドをsystemで呼び出すとsystemの戻りは256(おそらくシェルの返すexitコード=1)だけでした。
-1は戻りませんでした。
256と-1が交互になるのは何か他の原因かもしれません。
もう少し調べてみます。
ありがとうございました。

No. 3125 # koko 2003/02/26 (水) 11:46:06
>>3124 koko
256と-1が交互になる件は解決しました。
SIGCHLDのシグナルハンドラを登録してあった為、シグナルハンドラが割り込んだ時のみsystemの戻り値が-1になっていた様です。
SIGCHLDをマスクしたところ、戻り値は256で安定しました。

No. 3126 # bebe 2003/02/26 (水) 19:00:41
find コマンドについて質問があります。
ファイル名で検索をかけたいと思うのですが、
UNIXだと英数字の大文字・小文字を区別してしまうので、例えば、
「a」で検索した場合、「A」というファイルは引っかからないかと
思います。
大文字・小文字の区別無く引っ掛けたいと思うのですが、その様な
オプション又は方法はありますか?

No. 3127 # 68user 2003/02/26 (水) 19:36:38
>>3126 bebe
最近の *BSD find や GNU find なら -iname とか -iregex とか。
そうでない find なら広めにひっかけて grep で絞りましょう。

No. 3128 # bebe 2003/02/28 (金) 13:58:18
>>3127 68user
findコマンドで引っ掛けられたらいいかと思ったのですが、
やっぱり広めに検索をかけて、grep等で絞り込むしかなさそ
ですね。
参考になりました。
有り難うございます。

No. 3129 # もも 2003/03/06 (木) 05:42:54
始めまして、いつもこちらでは陰ながら勉強させていtだいてます。
perlスクリプトのことでお教えください
ただ今企画中のスクリプトにおいて
外部コマンド実行時、そのコマンドプロセスの標準入力へ有る意味大量のデータ(文字列)を渡したいのです
しかしこの方法が全く頭に浮かばず情け無い状態であります!
PIPEやファイルシステムの基礎を知らない私にご教授下されば幸いです。

No. 3130 # 68user 2003/03/07 (金) 01:14:46
>>3129 もも
      open(OUT, "| command");
      print OUT "HOGEHOGEHOGEHOGEHOGEHOGEHOGE....";
      close(OUT);
ってことですか?

じゃなくて command の標準入力に渡しつつ、そのコマンドの
出力を受け取りたいなら IPC::Open2 などを使えばできます。
できますが、デッドロック回避などが面倒なので

      open(OUT, "| command > file");
      print OUT "HOGEHOGEHOGEHOGEHOGEHOGEHOGE....";
      close(OUT);
      open(IN, "< file");
      while (<IN>){
            ....
      }

でいーんではと思う軟弱な私。

No. 3131 # もも 2003/03/07 (金) 11:25:16
>>3139 金床
68user様なるほど理解しました前者が出来ればいいのです!
早速試してみます。ありがとうございました!

No. 3132 # koko 2003/03/10 (月) 10:36:24
親プロセスが複数の子プロセスを生成します。
親は子プロセスの終了をシグナル(SIGCHLD)ハンドラで検知し、waitで子プロセスの終了コード(exitの引数)を取得しています。
同時に、子プロセス数を減算します。(forkで子プロセス数を加算しています。)
シグナルハンドラの処理中に、別の子プロセスが終了した場合、SIGCHLDが無視されてしまう。
あるいは、ほぼ同時に複数の子プロセスが終了した場合には、1回しかSIGCHLDのシグナルが発生しないとの記述を見た事があるのですが、正しく全ての子プロセスの終了を検知する方法はありますでしょうか。
以前、頂いたNo. 2988で頂いた以下の方法でこのような懸念が解消されますでしょうか。

SIGCHLDのシグナルハンドラ--------------------------
        int pid,status,code;

        while((pid=waitpid(-1,&status,WNOHANG))>0){
                if(WIFEXITED(status)){
                        code = WEXITSTATUS(status);
                }
        }
--------------------------------------------------
また、waitpidがシグナルに割り込まれるとエラーになり、errnoにEINTRが設定されると思うのですが、WNOHANGを設定していた場合にはそのような事は無いと考えてしまって良いでしょうか。
よろしくお願いします。

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