68user's page 掲示板

Prev< No. 77〜95> Next  [最新発言に戻る] [過去ログ一覧]
No. 77 # mm [URL] 1999/01/15 (金) 21:43
こちらでは、はじめまして。
「ネットワークプログラミングの基礎知識」を読ませて頂きました。
で、本題の方は、向こうで話題にしてしまったので(^^;
ちょっとズレた質問で申し訳ないのですが、「inetdの役割」で
「UNIXでは現在実行中のプログラムのことをプロセスといいます」
という定義がありますよね。
この「プロセス」というものがもう一つよく分からないのです
(inetdの説明上では理解できるんですが…)。

「実行中」というのは、1つのプロセスのプログラムがexecで
切り替わった場合も、プロセスとしては同じだという意味で
受け取っていいのでしょうか?
また、プロセスというのは、カーネルがスケジュールに従って
実行時間を割り当てる単位と考えてもいいのでしょうか?

それから、UNIXではプロセスを生成できるのはforkだけだと聞きますが、
forkって親プロセスのメモリイメージとレジスタを丸ごとコピーする
んですよね。この場合、子プロセスが直ぐにexecでプログラムを切り替えても、
メモリ上には親プロセスのコピーがそのまま残るんでしょうか?
(execで切り替わったプログラムが終了しても、子プロセスがまだ
実行を続けるかも知れないので、こんなコピーの残骸で一杯になりそうな
気がするのです…)

それと、マルチプロセスと関連のありそうな言葉として、タスク、スレッド、
コンカレント、コルーチンなどとの相違も教えて頂ければうれしいです。
スレッドは、プロセス内プロセスみたいなもの…?
コルーチンは、Windowsの3.1以前のアプリケーションみたいなもの…?

なんか、ネットワークとぜんぜん関係ないなぁ…すいませんです(^^;

No. 78 # 68user 1999/01/16 (土) 07:41
mmさん、はじめまして(とか言ってみたりして(笑))

> execで切り替わった場合も、
> プロセスとしては同じだという意味で
> 受け取っていいのでしょうか?

#!/usr/local/bin/perl
if ( $pid = fork ){
    print "子プロセスは$pidです。\n";
    sleep 2;
    system("ps aux|grep $ENV{USER}|grep perl");
    print "\n";
    sleep 4;
    system("ps aux|grep $ENV{USER}|grep -E '(perl|sleep)'");
    wait;
} else {
    sleep 4;
    exec("sleep 5");
}
# fork、ps、子プロセスがexec(sleep)、psという順番で動くように、
# ところどころにsleepを入れてます。

を実行したところ、
    子プロセスは714です。
    zxr400 713 0.8 1.6 712 988 p2 S+ 7:25AM 0:00.02 perl fork (perl5.00404)
    zxr400 714 0.0 1.5 648 956 p2 S+ 7:25AM 0:00.00 perl fork (perl5.00404)

    zxr400 713 0.0 1.5 712 944 p2 S+ 7:25AM 0:00.02 perl fork (perl5.00404)
    zxr400 714 0.0 0.1 172 60 p2 S+ 7:25AM 0:00.00 sleep 5
となります。プロセス番号714の子プロセスが、exec sleep 5しても
やはりプロセス番号は714のまま、ということだと思います。

> また、プロセスというのは、カーネルがスケジュールに従って
> 実行時間を割り当てる単位と考えてもいいのでしょうか?

僕もそういうふうに理解しています。

> execで切り替わったプログラムが終了しても、子プロセスがまだ
> 実行を続けるかも知れないので、こんなコピーの残骸で一杯になりそうな
> 気がするのです…

execが戻ってくるのはexecに失敗したときだけで、execの実行に成功すると
絶対に戻って来ません。だから元のプロセスのイメージを保持しておく
必要はないですから、OSが掃除してくれるんじゃないでしょうか。

> タスク、スレッド、コンカレント、コルーチン

うーん、僕もよく知らないんですが…。スレッドに関しては、

> スレッドは、プロセス内プロセスみたいなもの…?

でいいのかなぁ。

Javaではスレッドを使うことでプロセスの中で並列実行ができます
よね。一方「マルチスレッド版echoサーバ」というのは、ただ単に
「並列処理ができるよ」くらいの意味ですが、別にスレッドを
使っているわけではなく、forkで実現しています。
また、FreeBSDではスレッドへの対応が進み、スレッドセーフな
OSになりつつあるようです。

というわけで、「スレッド」という言葉はどの環境を指して
使うかで結構意味に違いがあるんじゃないかと思うんですが…。

あと、「タスク」はUNIXの用語でしたっけ。多分Winの用語かな
と思うんですが、結局ここらへんはプロセスと呼ぶかタスクと
呼ぶかの違い、単純に呼称の違いではないかと思ってるんですが…。

コンカレント・コルーチンは初めて聞きました(^^;

No. 79 # mm 1999/01/16 (土) 18:51
68user さん、どもです(笑い)

>となります。プロセス番号714の子プロセスが、exec sleep 5しても
>やはりプロセス番号は714のまま、ということだと思います。

そそ、そんなイメージでした(^^;
先のpsの時点と後のpsの時点では実行されているプログラムはちゃうけど、
プロセスとしては同じなんだという意味ですね。

>僕もそういうふうに理解しています。

安心しました(^o^;ゞ

>Javaではスレッドを使うことでプロセスの中で並列実行ができますよね。

そのヘンがプロセスとスレッドとの違いかなと思っていたのです。

>というわけで、「スレッド」という言葉はどの環境を指して
>使うかで結構意味に違いがあるんじゃないかと思うんですが…。

このヘンの用語は仰る通りだと思います。
で、一応UNIXでのことを伺ったつもりだったのですが、書いてませんでしたね(^^;

私にとっては、「スレッド」という言葉は少なくともコンピュータの分野では
Javaで始めて聞いたような気もするんで(スレッドタイプの掲示板というのも
ありますが…(^^;)、一応Javaのスレッドを想定していたのですが、
>一方「マルチスレッド版echoサーバ」というのは、ただ単に
>「並列処理ができるよ」くらいの意味ですが、別にスレッドを
>使っているわけではなく、forkで実現しています。
>また、FreeBSDではスレッドへの対応が進み、スレッドセーフな
>OSになりつつあるようです。
ということは、一般的にはもっと広い意味がありそうですね。

>あと、「タスク」はUNIXの用語でしたっけ。多分Winの用語かな
>と思うんですが、結局ここらへんはプロセスと呼ぶかタスクと
>呼ぶかの違い、単純に呼称の違いではないかと思ってるんですが…。

あっ、UNIXでは「タスク」は使わないんですね。
確かに岩波の情報科学辞典なんかでも、「プロセス=タスク」としています。
ただ、「タスク」はWinの用語(その場合の意味は?)だけでなく、
もっと古くから使われているようで、その頃、「マルチタスク」と
「マルチプロセス」とは違うんだよ、というような話を
聞いたような気もしたもので…(^^;

>コンカレント・コルーチンは初めて聞きました(^^;
concurrent は、どうも並行という一般的な意味みたいです。
concurrent Pascalとかconcurrent CP/M なんてのを聞いたことが
あったのですが、どのように並行してたのかは知りませんです。
(この並行と多重(multi)の違いもよく分からない(^^;)

coroutinは、原始的な並行プロセスかな…
確か、各ルーチンごとに専用のスタックを持って、自分の処理が
一段落すると、レジスタなどの環境をスタックにpushして、
別のルーチンを呼ぶ。
別のルーチンも自分のスタックから環境をpopして処理を行い、
これが一段落すると、また環境をスタックにpushして元のルーチンや
別のルーチンを呼ぶ、ということを繰り返して並列処理を
実現するものだったと思います。
で、どれかのルーチンがCPUを独占してしまうと、
もう並行プロセスにならないってものなのです。


>execが戻ってくるのはexecに失敗したときだけで、execの実行に成功すると
>絶対に戻って来ません。だから元のプロセスのイメージを保持しておく
>必要はないですから、OSが掃除してくれるんじゃないでしょうか。

ありゃ…すいません、完全に誤解してました(^o^;ゞ
execは戻らないんですね(MS-DOSとごっちゃにしてたかな?)
実は、シェルが一旦forkしてからexecするのも疑問だったのです。

No. 80 # mm 1999/01/17 (日) 13:59
ちょっと間違いです(^^;
>execは戻らないんですね(MS-DOSとごっちゃにしてたかな?)
MS-DOS でも exec は戻りませんでした。
(いずれにしても、単一プロセスのMS-DOSの感覚が
なかなか抜けないみたいです…(^^;)

No. 81 # 涙… [E-mail] 1999/01/18 (月) 00:24
AppleScript対応したtelnetソフトがないぃぃぃぃ…
ってわけで、ここ1週間ほど、朝6時頃おきて、サーバーに繋いで
コマンド打ち込んで…をくり返す毎日でございます。

ブラウザ上からCGI直接指定して、うまく動かせるようにできんかな…
だったら、毎朝自動的に立ち上げてほっぽっときゃいいし(笑)

No. 82 # ROL [E-mail] 1999/01/18 (月) 00:25
下、ワシの発言です。
つい、名前のとこに「タイトル」を入れてしまった(笑)

No. 83 # ROL [E-mail] 1999/01/20 (水) 12:31
tarでファイルを一つにまとめて出来るファイル(% tar xf〜で指定)を直接いじって大丈夫でしょうか?
ファイルの書き換えが面倒なので「% tar xf〜」で複数のファイルを一つにまとめ、一括して特定の文字列を置換したあと、
元に戻す…ってのをやりたいんですけど?

No. 84 # ROL [E-mail] 1999/01/20 (水) 14:36
すんません、お師さん。
下の質問は無視ぶっこいてください。
実験の結果、だめな事が立証できましたわ。

No. 85 # 68user 1999/01/20 (水) 15:56
file1 file2を
    % tar cf file.tar file1 file2
でfile.tarにアーカイブして、file.tar自体をいじる、ってことですか?

tarファイルはヘッダが付いてますので、一般的には無理です。
が、絶対不可能ってことはないんじゃないかなぁ。
エディタなどでは無理でしょうし、aをbに変換、なんてのは
ヘッダを書き換えてしまう可能性があるのでダメでしょうが、
hogehogehogehogeをfugafugafugafugaに変換、ってのは
たぶんできるんじゃないでしょうか。

とはいえ
opendir(DIR,".");
@files = grep(/file\d/,readdir(DIR));
closedir(DIR);

foreach $file (@files){
    open(IN,$file);
    @buf = <IN>;
    close(IN);
    open(OUT,">$file");
    foreach (@buf){
        s/a/b/g;
        print OUT $_;
    }
    close(OUT);
}
なんてやる方をお勧めします(バックアップを忘れずに)。

# perlにファイル自体を書き換えるオプションがあったかな?

No. 86 # mm 1999/01/21 (木) 03:26
># perlにファイル自体を書き換えるオプションがあったかな?
    perl -pi.bak -e "s/a/b/g;" file[0-9]
では?

No. 87 # 68user 1999/01/21 (木) 05:12
> perl -pi.bak -e "s/a/b/g;" file[0-9]

うーん、簡単ですねぇ。ちなみに僕は最近までオプションは -wと-e
しか知りませんでした。でも最近-cを覚えました(^^;

分厚いマニュアルをめくってオプション調べるより自分で書いた方が
早いんで、なかなか覚えられないんですが、長い目で見るとさっさと
オプション覚えた方がいいんでしょうけどね…。

# 一番悪いのは、青ラクダ本の目次。「オプション一覧」とか
# 「スイッチ一覧」なんて項がない。どこに書いてあるかと
# 言えば「コマンドインタプリタとの協調」。毎回オプション解説を
# 探すのに苦労してます。…ま、言い訳ですな(^^;

> ブラウザ上からCGI直接指定して、うまく動かせるようにできんかな…

CGIはnobody権限で動きますので、CGI経由で作られるファイルは
全て所有者がnobodyとなります。ファイル消せなくなってあわてない
ように(笑)

No. 88 # mm 1999/01/21 (木) 21:29
># 一番悪いのは、青ラクダ本の目次。

青いラクダは、確かに読みづらいですよね。
私の場合、普段は「日本語 perl texinfo バージョン 4.0.19.2」のプレーンテキ
スト版をオンラインマニュアルとしてを使ってます。高尾直弥さんという方の訳
ですが、リファレンス部分は赤いラクダとほぼ同内容だと思います。

ただ、今使ってるものはいろいろイジってて配布条件(GNU)上問題があるのと、
手元にオリジナルが見当たらないので、ちょっと探してみましたが、根性がない
ので↓のようなHTML版しか見つけられませんでした(^^;
    http://www.cec.co.jp/usr/hasegawa/Docs/perl-jman/index.html
でも、どこかに必ずオリジナルのtexinfo やプレーンテキスト版もあると思いま
す(^o^;ゞ

WindowsのヘルプやHTMLよりも、やっぱりエディタで正規表現検索が可能な普通の
テキストが使い易い…

No. 89 # mm 1999/01/21 (木) 22:15
日本語 perl texinfo の1頁ものがありました。
http://main.ipc.fukushima-u.ac.jp/fdai/man/perl.html
テキスト版の前後を<pre></pre>で括っただけなので、ブラウザではちょっとヘンになりますが、
直ぐにテキストに戻せると思います。

No. 90 # 68user 1999/01/24 (日) 00:21
どうもです。早速GETさせていただきました。
これでちょっとは賢くなれる…かな?(^^;

No. 91 # SRM2 1999/01/27 (水) 01:30
はじめまして(^^;
Perl関係で質問なのですが良いでしょうか。
Perlのみで画像(画像ファイル)の生成って出来ないんでしょうか?
いろいろ書けるほど情報が集まってないので、簡単ですがこれで。
よろしくおねがいします。

No. 92 # 68user 1999/01/27 (水) 02:36
はじめまして、SRM2さん(笑)

うっとこの
    http://X68000.startshop.co.jp/~68user/cgi-bin/view-count.cgi?log=sum0+sum1+sum2+sum3
は、flyというプログラムを利用していますが、perl単体で
ということなら、GD.pmというライブラリを使うといいでしょう。
    http://www.genome.wi.mit.edu/pub/software/WWW/GD.html
をどうぞ。英語ですが使い方は簡単にわかるはずです。

No. 93 # 山口 1999/01/27 (水) 18:38
はじめまして、山口といいます。
いきなりの質問で失礼ですが、.forwardの中にメールアドレスを書くと、届いたメールはその書き込んだメールアドレス当てに転送されますが、その時もとのメールアドレスでもみれるようにするにはどうすれば良いでしょうか。
    要するに転送する時に自分のところにオリジナルは置いておいて、そのコピーを転送するというぅような形にしたのですが。
    どなたかアドバイスを下さい。

No. 94 # M.Masuda [E-mail] 1999/01/27 (水) 21:59
はじめまして 68userさん M.Masudaです。

いや〜こちらのページにはじめてよらせていただきましたが
ずいぶんと勉強になります。

先ほど、CGIスクリプト関連をDOWNしたのでこれからおいおい
解析して勉強させていただきます。

にしても、PerlだけでなくUNIXやプロトコル・ネットワーク
関連の情報量には驚くばかりです。
これからも、宜しくお願いします。

ところで本題ですが。

自分で実験してみればいいのでしょうが、ファイルロックの
アルゴリズムには、一般的にflockを採用している物や、ロッ
クファイルを作成してスクリプト自身がロックを管理してい
る物が有りますが、今までの68userさんの経験上どういう手
法が一番効果が高いでしょうか。

あと、下の山口さんの質問は私も興味ありです(笑)
本屋さんでオライリーのsendmailかmailの本でも買って勉強
すればいいのでしょうが、それだけのためにはオライリーシ
リーズは高すぎる!!!
ここでうなずいた方は、沢山いるはず(爆笑)

#68userさんはレスの書込みの時間が遅い(早い?)ですが何
#をしてる方なのでしょうか?

そろそろ中級に足のかかってきた私ですが、宜しく御教授下
さい。

No. 95 # 68user 1999/01/27 (水) 23:27
はじめまして>山口さん、M.Masudaさん

山口さんのユーザ名がhoge、転送したいところがfoo@bar.com
だとしたら、.forwardに
    \hoge,foo@bar.com
と書けばいいです。カンマで区切ることで、複数の転送先を
指定できますから。しかし
    hoge,foo@bar.com
と書いてしまうと、hoge宛に(つまり自分自身)転送されますが、
再度 .forwardが参照されて、またhogeに送ろうとして…という
ふうに、無限ループに陥ります。

つまり、「\」を付けると「.forward を参照するな」という意味に
なりますので、無限ループが防げるわけです。

# ただ「\」を付けなくても、大抵のメールサーバだと数回ループ
# したら止まるでしょうし、最近のsendmailは賢いので一度もループ
# しないかもしれません。でも、念のため \ を付けておいた方が
# いいでしょう。


> 今までの68userさんの経験上どういう手法が一番効果が高いでしょうか。

特に詳しいわけではないんですが、選択肢としては
    1.flock
    2.mkdir
    3.シンボリックリンク
あたりでしょうか。うちのカウンタは3ですし、このBBSは2です。
flockはNFS環境では動かないところもある(動くところもある)
ということで、使ったことは一度もありません。

ただ2も3も、たま〜にロックが残ったままになることはあるんですよね。
でもOSレベルでは完璧に排他処理はできているはずです。
ですから、webサーバがシグナルを送って、CGIのプロセスを止めたとき
にロックが残るのではないかと思うんですが、本当にそうなのか、
どういう状況で起こるのか、などの検証はできていません。

完璧な方法があれば僕も知りたいです(^^;

> #68userさんはレスの書込みの時間が遅い(早い?)ですが何
> #をしてる方なのでしょうか?

ははは、生活リズムが不規則な ただの学生です(^^;

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