Linuxでforkやalarm,wait,waitpid,syscallなどを使ったサンプル

このQ&Aのポイント
  • LinuxのPerl5.8でforkやalarm,wait,waitpid,syscallなどの関数を習得するためのサンプルプログラムとは?
  • 要約文2
  • 要約文3
回答を見る
  • ベストアンサー

Linuxでforkやalarm,wait,waitpid,syscallなどを使ったサンプル

今までWindowsのPerlを使っていました。 forkやalarm,wait,waitpid,syscallなど使ったことがなく、 LinuxのPerl5.8でそれらの関数を習得したいのですが、 何か良いサンプルはありますか? これに特化した書籍も探しています。 今作りたいものは、 forkで10個プロセスを作成して、ループし、 以下それぞれhello worldを表示させ終わったら、 1個目は終了しました。 2個目は終了しました。 ・・・ 10個目は終了しました。 終わり。 と表示させるプログラムが作りたいです。 fork,alarm,wait,waitpid,syscallなどプロセス操作、システムコール関数を全て使った良いサンプルも探しています。 ------------------------------------ それぞれのhellow word 1個目は 5秒後に hello worldを表示させる 2個目は10秒後に hello worldを表示させる ... 10個目は50秒後にhello worldを表示させる を使いますが、今まで

  • Perl
  • 回答数1
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
  • maura
  • ベストアンサー率46% (48/104)
回答No.1

この質問の要求は 4つですね。 1.forkで10個プロセスを作成して、ループし、  以下それぞれhello worldを表示させ終わったら、  1個目は終了しました。  2個目は終了しました。  ・・・  10個目は終了しました。 2.fork,alarm,wait,waitpid,syscallなどプロセス操作、システムコール関数を全て使った良いサンプル探している 3.これに特化した書籍も探しています。 4.hellow word   1個目は 5秒後に hello worldを表示させる   2個目は10秒後に hello worldを表示させる   ...   10個目は50秒後にhello worldを表示させる 違っていたらご指摘をお願いします

tanaka22
質問者

補足

簡潔にまとめていただきましてありがとうございます。 4つです。 forkは、結局waitpidすると、そこで止まってしますのですね。 たとえば10個を順に監視することや、2CPUの場合、両方均等に負荷をかけるなどの芸当はできないのでしょうか?

関連するQ&A

  • fork、exec系、wait系のシステムコール(ライブラリ関数)でのシェル

    簡単なシェルを fork、exec系、wait系のシステムコール(ライブラリ関数)を利用して作りたいですがどのようなソースになるでしょうか? 最低限、以下の機能を実現しなければなりません 1.プロンプトを出力する 2.ユーザに端末からコマンドを入力させる 3.新しくプロセスを生成し、そのプロセスが入力されたコマンドのプログラムを実行する 4.そのコマンドの実行(子プロセス)が終了するまでシェル(親プロセス)は、プロンプトを出さずに待つ 5.1に戻る どうやってもうまくいかないので教えていただけないでしょうか

  • Perlのforkについて

    PerlでDBに格納するプログラムを作成しています。 パラレルで行ないたいためにforkを使っているのですが、 いまいちわかっていないのでご教授ください。 やりたいことはパラレルでのDB格納です。 親、子両方のプロセスが完了したら後続処理を行い、 0を戻したいのですが、下記の方法ですと、 子が終了したらprintしてからreturnしているようです。 このように、親子の処理が完了したら後続処理に移るようにするためには どうしたらよいのでしょうか? if ($pid = fork()) { #親プロセス insertDB(); wait; return 0; } else { insertDB(); } print"ここは最後に通したい"\n;

    • ベストアンサー
    • Perl
  • UNIXの関数をWindowsで使用するには?

    今までUNIX系OSで作成したプログラムを WindowsXPでVisualStudioでコンパイルしたいと思っています。 ここで、 pipe、fork、execl、wait、waitpidの関数を使用するためには、 どのヘッダファイルをインクルードすれば良いでしょうか? どれか1つの関数でも良いので回答をお願いします。 宜しくお願いします。

  • python: fork後の標準出力について

    言語はpythonです。(バージョン : 2.6.6) 以下の二つの単純なpythonスクリプト   test.py, exe_fork.py があります。 [test.py] #!/usr/bin/env python import subprocess proc = subprocess.Popen("./exe_fork.py", stdout=subprocess.PIPE) result = proc.stdout.read() print result [exe_fork.py] #!/usr/bin/env python import os import time pid = os.fork() if pid != 0: print "parent\n" else: time.sleep(5) print "child\n" [動作] 各スクリプトの動作としては、 test.pyがexe_fork.pyをPopen(stdoutはPIPEで受信)で実行し、 read()メソッドでexe_fork.pyの標準出力を受け取り、表示する。 exe_fork.pyはforkして、   親プロセスは"parent"と出力   子プロセスは5秒後に"child"と出力 です。 [実行結果] test.pyを実行すると 5秒後に   parent   child と表示されました。 これを実行する前は実行後すぐに "parent" と表示されてスクリプト終了するのだと予想しておりました。 しかし実際はexe_fork.pyの親と子の両方のプロセス終了するまで何も表示されず 両プロセスが終了した後にtest.pyのread()メソッドが完了するようです。 (どういうしくみでそうなっているのかよくわかりません。。) [質問・相談] test.pyでexe_fork.pyの親プロセスの標準出力だけを反映する方法ございませんでしょうか? なお、都合上、以下の条件を満たしている必要がございます。  条件1: test.py側のソースは変更しない  条件2: exe_fork.pyの親プロセスが終了した時点でtest.pyのread()メソッドが終了する  条件3: forkptyは使わない [参考]  exe_fork.py側で子プロセスのみsys.stdout.close()してみましたが結局exe_fork.pyの子プロセスが終了するまで(=5秒経過するまで)test.pyのread()メソッドは完了しませんでした。   よろしくお願いします。

  • C言語 fork()について

    C言語 fork()について C言語でSystem Call fork()というものがあるそうで、まずは http://cai.int-univ.com/sugsi/Lecture/NetProg/chapter5/fork.html こちらのサイトの例をvisual studio 2008で実行させてみようと思ったのですが、以下のエラーが表示されてしまいました。 1>c:\users\user\documents\visual studio 2008\projects\project1\system call fork\system call fork\system call fork.cpp(3) : fatal error C1083: include ファイルを開けません。'unistd.h': No such file or directory ソースは以下のものです。 #include <stdio.h> #include <sys/types.h> #include <unistd.h> int main(void) { int pid; char msg[256]; sprintf(msg, "hello world"); //sprinf()でmsgにhello worldを格納する pid = fork(); if(pid == 0) printf("%s, child process\n", msg); else printf("%s, parent process\n", msg); return 0; } #include <unistd.h>について注意されていますが、これは何なのでしょうか? #include<stdio.h>ならprintf()などの基本的な関数を使うのに必要なものと覚えたので、 #include <unistd.h>もfork()を使うときに必要なものだろう程度に思っているのですが、どうすれば、まずこのプログラムが実行できるんでしょうか? No such file or directoryと書かれているぐらいですから、下準備としてこのプロジェクトが保存されている場所でtxtファイルか何かを準備しておく必要があるということですかね...

  • forkしてもバックグラウンドで動かない

    お世話になっております。 あるサイトで見たforkの例を元に下記のようなソースでバックグラウンドで処理 しようとしているんですが、処理が終わるまでブラウザがロックされて しまします。 $| = 1; rm("-f","$TmpPath$KYOTEN/result/*.*"); &Upload_Check; print "Content-type: text/html\n\n"; &DataProgHeader_Write; #画面の切替 &DataProgDetail_Write; FORK: { if( $pid = fork ) { close(STDOUT); wait; } elsif (defined $pid) { close(STDOUT); chdir "/u1/uca/htdocs/PPro"; system("perl U0302.pl $Dkyoten"); exit; } elsif ( $! =~ /No more process/) { sleep 5; redo FORK; } else { &MsgDisp("Forkできませんでした。"); } } # End Of Label:FORK バックグラウンドで動かない理由が分からないのです。 どなたかお助けください。 また、ソース中で system("perl U0302.pl $Dkyoten"); とありますが、サーバで直に動かすと正常に動作するのですが cgiから呼び出すと文字コードエラーで落ちてしまします。 (呼び出すCGIはEUCで書いていますが、U0302.PLは処理の都合上 SJISで書いています。) こちらも原因の想定がつきません。 どなたか参考サイトでも構いませんので、お教えください。 お願いいたします。

    • ベストアンサー
    • Perl
  • IIS7.0でPerlのCGIにてバックグラウンド

    はじめまして、初心者の質問で恐縮ですが、以下の点を教えて欲しいです。 IIS7.0のWebサーバで、CGIプログラムをPerlで作っているのですが、forkした子プロセス で時間のかかるバックグラウンド処理を行って、親プロセスでWebブラウザに返す処理を しようとしていますがうまくいきません。重たい処理が終了するまでWebブラウザに応答 されません。(子プロセスの終了が終わるまで、親プロセスのHTML表示処理がWebブラ ウザに返答されません)通常、子プロセスでclose(STDOUT)で親プロセスのHTMLの 表示処理が出来ると思っていますが。。。 どのようにすれば良いか教えてもらえると幸いです。以下は参考のプログラムです。 よろしくお願いします。 $|=0; if ( $pid = fork){ #親プロセス &disp_html(); #HTMLを表示させるプログラム wait; }elsif (defined $pid) {  #子プロセス close(STDIN); close(STDOUT); close(STDERR); &heaby_prog(); #重たい時間のかかる処理 exit 0; } else { die "Can't fork: $\n"; } よろしくお願いします。

  • Linuxで生成したプロセスに処理をさせるには?

    Linuxの学んでいる者です。 表題の件について、本を読んだり、ネットで検索したり したのですが、解決ができなかったため質問させて いただきました。 以下に例を挙げます。 1つのCファイルに、「main」と「A」と「B」という関数があるとします。 「main」関数にて、fork()で2つプロセスを生成し、一方のプロセスでは 「A」関数を実行し、もう一方では「B」という関数を実行させます。 「A」という関数は3秒ごとに「1,2,3,…」と数字を出力するもので、 「B」という関数は5秒ごとに「10、20、30、…」と数字を出力するものとします。 こういう場合に、プロセスに「A」や「B」の処理を実行させることができません。 exec関数でプロセスに別のプログラムを実行させることはできますが、 プログラムの実行ファイルのパスを指定して実行させるようなので、 この場合にはうまく使えません。 理解されている方には、本当に些細なことではあると思いますが、 私では解決にまで至らなかったので、ご教授いただければ幸いです。 よろしくお願いいたします。

  • LISPを今から覚えたい

    最近Lispを覚えようとパソコンで動作するLISPを探しているのですが、CommonLispに対応する学習に最適なフリーのインタープリタが見つかりませんでした。手に入れることは可能でしょうか? まずはじめにやりたいことは、数値と文字(Hellow world)を関数?に渡して、数値分文字を表示させるものが作りたいのですが、 そのようなサンプルがかける方、教えてください。 LISPを覚えるにはたくさんの関数?を覚えると習得が早いでしょうか? それとも、考え方を先に身につけた方が早いでしょうか?

  • 並列処理について

    今現在Perlの並列処理について勉強しているのですが、分からない点があるのでご教授願います。 重並列が可能となるプログラムを作りたいと思い、以下のプログラムを作成しました。countには並列数(例えば3並列にしたいならば3)が入っています。これで重並列ができたと思ったのですが、よくよく考えてみると、このプログラムだと一つ目の子プロセスが終わらなければ、二つ目、三つ目の子プロセスが始まらないということに気付きました。同時に複数のプロセスを実行させるにはどのようなプログラムにすればよいでしょうか。お願いします。 while($count--){ $pid = fork; if(!defined $pid){die "fork failed";} elsif(!$pid){ &process;#子プロセス exit; } } wait; ・・・・・・#親プロセス

専門家に質問してみよう