- PR -

親子プロセス間のデータ受渡し

1
投稿者投稿内容
NM
ベテラン
会議室デビュー日: 2003/08/28
投稿数: 93
投稿日時: 2004-08-12 14:12
質問ばかりで済みません。

ActivePerlで開発を行っています。

後記のコーディングの子で計数している$Rcntを子の処理が終わったら親で参照したいのですが当然ながらグローバルにしていても見れません。

このプログラムは同時に何本か走りますので$Rcntの値をファイル渡しで参照させることも上書きされるので難しいです。

何か良い知恵は無いものでしょうか?

以上

if ($pid = fork()) { # 親
(省略)
wait;
if($Rcnt >= 500){  <−ここで使いたい
(省略)
}
(省略)
return $RetNo;
}
else { # 子
(省略)
$Rcnt+++
(省略)
exit;
}

がるがる
ぬし
会議室デビュー日: 2002/04/12
投稿数: 873
投稿日時: 2004-08-12 14:33
どももです。がるともうします。
ちょいと、ヒントだけ。
もし「ど〜してもわからない」ようであれば、また質問など
していただけると。

手段1:プロセスIDを使う
子プロセスのプロセスIDをベースにファイル名を作れば、重複しない
ファイル名が生成できるので、そこで値のやり取りが可能か、と。

手段2:プロセス間通信
ActivePerlってことはWindowsですよね? なのでちぃと不安ですが。
プロセス間通信ってのはいつでも便利な手法かと思います。
調べてみるのもまた一興か、と。

頑張ってください ^^
NM
ベテラン
会議室デビュー日: 2003/08/28
投稿数: 93
投稿日時: 2004-08-12 16:15
済みません。手段1であれば出来るかとやってみました。PERLはど素人なので書き方がいけないのかも知れませんが子プロセスでは0を返すので次の様に成ってしまいました。


$pid = fork();
$LnkFil="LINK".abs $pid;
if ($pid) { # 親
print "---->$LnkFil\n";    ←ここではLINK2384の様になりますが!
}
else { # 子
print "---->$LnkFil\n";    ←ここではLINK0になってしまいます。
exit;
}
}
おばけ
ぬし
会議室デビュー日: 2002/11/14
投稿数: 609
お住まい・勤務地: 東京都江東区
投稿日時: 2004-08-12 16:33
引用:

print "---->$LnkFiln";    ←ここではLINK0になってしまいます。


Perlは最近めっきり書かなくなりました。
ところで、自分自身のプロセスのIDって$$とかで取れませんでしたっけ?
がるがる
ぬし
会議室デビュー日: 2002/04/12
投稿数: 873
投稿日時: 2004-08-12 16:52
どもでふ。
おばけさんがほぼ回答を出されているので蛇足かとは思うのですが。
コード:

$LnkFil="LINK"; # ファイル名の先頭文字を適当に指定
$pid = fork(); # プロセスをfork
if ($pid) { # 親
# 子プロセスIDをファイル名の後ろにくっつけてみる:親プロセスだから
$LnkFil .= $pid;
print "sire----->$LnkFil\n";
}
else { # 子
# 自プロセスIDをファイル名の後ろにくっつけてみる:子プロセスだから
$LnkFil .= $$;
print "chiled--->$LnkFil\n";
exit;
}


例えば、こげな感じでいかがなもんでしょ?
うまくいくか、また悩んでしまったら書き込みしてください〜 ^^


[ メッセージ編集済み 編集者: がるがる 編集日時 2004-08-12 16:53 ]
NM
ベテラン
会議室デビュー日: 2003/08/28
投稿数: 93
投稿日時: 2004-08-12 23:00
有難う御座いました。

親ではfork()で返されたPIDを使い子では特殊変数の$$を使えば良かったのですね!

早速、確認しました。

やっと、完成と思い開発機から運用で使う通信サーバーにセットアップしたら、「fork()はサポートされていません。」と言うエラーで使えませんでした。

結局、子プロセスを発生させないで待たせる方法に成ってしまいました。

折角出来たのに残念です。
1

スキルアップ/キャリアアップ(JOB@IT)