• 締切済み

プロセスグループについて

スレッドで起動されたプロセスは親プロセスをリーダとするプロセスグループを形成するというのは、シグナル処理で理にかなっていると理解しているのですが、シェルからパイプで繋いで起動してプロセスもプロセスグループを形成する。とある本に書いてありました。セッションとのからみかな。と漠然と思ったりしているのですが、パイプで繋いだプロセスが何故プロセスグループを形成する必要があるのか見えてきません。パイプで繋いだプロセスは、何故シェルを親とするプロセスグループ形成する必要があるのでしうか?

みんなの回答

  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.1

正確にはなんと書いてあったのでしょうか? 以下、回答になるかどうかわかりませんが、用語の説明をします。 シェルにおいては、1つの実行単位をパイプラインと呼びます。必ずしも | で結ばれていなくても。 man bashでは、このように書かれています。 >パイプライン (pipeline)は、記号 | で区切った 1 つ以上のコマンド列です。パイプラインのフォーマットを以下に示します: > > [time [-p]] [ ! ] command [ | command2 ... ] つまり、コマンド1つの場合も含まれるので、シェルプロンプトで、 $ date [Enter] としても、それは一つのパイプラインなわけで、1つのプロセスグループを形成します。jobsやfg、bgコマンドなどでハンドリングする単位です。この意味ではジョブとも呼ぶ。 セッションというのは、昔は端末プロセスグループと呼んだものだと思いますが、同じ制御端末を有するプロセスグループ群で、端末が死んだときにSIGHUPが送られる範囲を指すと思います。 システムコールやプロセス間通信の意味でのパイプと、上記シェルのパイプラインが厳密に使い分けられているかどうかは疑問で、両者とも単にパイプと呼ばれているような気がします。プロセスグループに関連して出てきた「パイプ」という用語はまず間違いなく「パイプライン」のことだと思います。

north111
質問者

お礼

そうそうの回答ありがとうございます。原文では「プロセスグループはシェルのパイプでつながれたプロセス群で、ジョブに対応します。」となっていました。 確かに内部的にはパイプはファイルと同じように、マウントできないpipfsファイルシステム下のinodeベーの読み書き。と認識しております。notnotさんの仰るようにここはパイプラインのことではと思っています。

north111
質問者

補足

先にアップしてからふと思ったのですが、パイプラインは一方のプロセスのファイルディスクリプタ0の標準入力を、片方のファイルディスクリプタ1に、ファイルディスクリプタ1の標準出力を片方のファイルディスクリプタ0に繋ぎ変えて、そして内部的には通常のパイプと同じ処理をしているのではと。 そうなると、プロセスグループである必要がない。(プロセスグループはただタスク構造体のtgidというメンバーにプロセスリーダとなる親プロセスIDを設定しとそのリストを作っているだけ、大した処理はしてないようです。)そうなると、パイプラインを形成するのにプロセスグループが必要というのでなく、もし片方のプロセスにエラーが発生してフリーズしてしまえば、一方のプロセスの入出力ができなくなってしまい、そのような事態をさけるために、一方がアボートすれば他方のプロセスもアボートするようにするためでは。と思ったしだいなのですが・・・。どのようなものでしょうか?

関連するQ&A

  • プロセスとスレッドの違いについて(Cプログラミングの観点から)

    プロセスとスレッドの違いがしっくりきません。 <プロセス> (1)プログラムの実行単位。Windows や Linux などの汎用 OS 上のアプリケーションは一般にプロセスとして動作している。プロセスは1つ以上のスレッドと、ファイル、ヒープメモリなどのリソースで構成される (2)起動や切り替えのオーバーヘッドが大きい <スレッド> (1)同一プロセス内の複数スレッドを同一メモリ空間上で実行でき、メモリ消費量などが軽減できる。 (2)マルチスレッド処理のプログラミングにおいては、同じデータを複数のスレッドが同時に書き換えることによる不整合に注意し、排他制御を行う必要がある。 等はwiki等調べて理解しています。 何が疑問なのかと申し上げますと、具体的にプログラミングする際に (1)マルチプロセスとマルチスレッド方式では、ソースにどのような違いが出てくるか (2)マルチプロセスとマルチスレッド方式では実行時間がどれだけ変化するか がわからないのです。お仕事で並列処理等について担当されている方などおられましたら、お手数ですがご教授ください。 なお、わかりやすい書籍、webサイト等ありましたらそれも併せて教えていただけると助かります。よろしくお願いします。ちなみに、環境はWindowsXP,VisualC++ExpressEdition2005を使っていますので、UNIXよりはWindowsかつCで動くプログラム例で教えていただけると大変助かります。しかし、当方Javaも多少であれば組めますのでJavaでも構いません。 何卒、よろしくお願い致します。

  • 別プロセスの起動

    別プロセスの起動について質問があります。 Java、Servlet、JSPを使って検索画面、検索処理を作っています。 レコード件数が何万件もあるので、検索処理を別プロセス(別クラス)で実行したいと考えています。 クラス構成は、 1.検索条件受け取りクラス 2.検索処理クラス 検索条件受け取りクラスで、検索条件をオブジェクトにし、そのオブジェクトを検索処理クラスの引数に渡し、別プロセスとして実行するような感じで考えています。 ※スレッドでの実装は、メモリを消費するため考えておりません。 実装方法やサンプルをよろしくお願いします。

  • Linuxでの別プロセス起動について

    コマンド置換を使用した場合に、シェル自体が子プロセスとして立ち上がる場合とそうでない場合があります。 具体的には以下のような場合です。 【パターン1】 コマンド置換内の処理が1行の場合は子プロセスが発生しない abc=`pstree` echo $abc -sshd-+-sshd---bash---pstree (該当部分だけを切り出しています) 【パターン2】 コマンド置換内で処理が2行以上ある場合は子プロセスが発生する abc=`echo; pstree` echo $abc -sshd-+-sshd---bash---bash---pstree (該当部分だけを切り出しています) パイプを使用した場合には子プロセスとして処理が実行されることは認識しているのですが、コマンド置換の場合も子プロセスとして実行されるのが普通なのでしょうか? だとすれば、パターン1のように処理が1行だけの場合には子プロセスとして立ち上がらない理由は何でしょうか? このあたりに詳しい方、ご教示いただければ幸いです。

  • 【Ruby】マルチスレッドでなくマルチプロセスで

    以下の様なプログラムをマルチスレッドでなくマルチプロセスで実現したいです。 #!/usr/bin/ruby require 'thread' q=Queue.new data=%w(a * * * b * * c * * d * *) data.each do |d| q.push d end (1..4).each do |n| Thread.start { while 1 do d=q.shift break if d!='*' end puts n.to_s+' '+d.to_s }.join end rubyのバーションは ruby 1.8.7 (2012-02-08 patchlevel 358) [universal-darwin10.0] です。バージョンをあげる事は、できれば避けたいです。 実際には上記プログラムの【puts n.to_s+' '+d.to_s】してる所は、ネットに繋いで云々の時間のかかる処理なのですが、まったくパラレルに行なっている様子が無いので、マルチプロセス化したら早くなるかなと思いました。 子プロセスを生成して親プロセスとはパイプで繋いで、、などとするのかなあと試行錯誤したのですが、どうもうまくできません。 ご指導の程、よろしくお願い申し上げます。

    • ベストアンサー
    • Ruby
  • Oracleで今接続しているセッションをSQLで知りたい。

    こんにちは Oracleで自分がどのセッションIDで接続しているかを調べる方法を教えてください。 条件:同一端末より複数プロセス(同一EXE)※から別セッションで接続しています。 ※複数スレッドで別セッションで処理が並列で行われる。

  • Linux KVMゲストOSのプロセスはホスト上で

    LinuxでKVMを使ってゲストOS環境を用意し、そこで各種プロセス/スレッドを起動した場合、それらはホストOS上でどう見えますでしょうか? ・ホストOS上にも同じようにプロセス/スレッドが作成される。ゲストからはアクセス可能だがホストからは存在を認識できるだけで、特権ユーザーでなければkillできない。 ・ホストOS上のKVMプロセスが利用するリソース(CPU、メモリ、etc.)が増えるだけ。ホス トからはゲストが何をやってるか全くわからない。(VMWare Playerと同じような感じ) どちらになるでしょうか? クラウド化するにあたっての実験をこれから計画するにあたって、事前にプロセス/スレッドの振舞いを知っておく必要があり、ご質問いたします。

  • シェルスクリプトのコマンド グループ化における変数の有効範囲について教

    シェルスクリプトのコマンド グループ化における変数の有効範囲について教えてください。 中括弧"{ }"を使うと親プロセス(=その実行中のプロセス)にて実行、 小括弧"( )"を使うとサブシェル(=子プロセス)にて実行されると認識しています。 また環境変数は子プロセスに引き継がれ、シェル変数は引き継がれないと認識しています。 以下のシェルスクリプト(Bシェル)でテストしたところ、続くような結果となりました。 ~スクリプト内容~ #!/bin/sh ##TEST1 VAR01=AAA { echo 中括弧内でVAR01は${VAR01}; } ( echo 小括弧内でVAR01は${VAR01}; ) ##TEST2 { VAR02=BBB; echo 中括弧内でVAR02は${VAR02}; } echo 外でVAR02は${VAR02} ##TEST3 ( VAR03=CCC; echo 小括弧内でVAR03は${VAR03}; ) echo 外でVAR03は${VAR03} ~実行結果~ 中括弧内でVAR01はAAA 小括弧内でVAR01はAAA 中括弧内でVAR02はBBB 外でVAR02はBBB 小括弧内でVAR03はCCC 外でVAR03は  VAR02、VAR03の結果は納得できます。 またVAR01が{ }に引き継がれているのも納得できました。 しかし、VAR01はシェル変数として作成した(exportによる環境変数化はしていない)にも関わらず、子プロセスである( )内処理にも引き継がれているのはなぜなのでしょうか? 

  • Java 特定プロセス名前取得方法について

    Java 特定プロセス名前取得方法について こんにちわ。 昨日に引続きまた質問させてください。 Javaで特定のプロセス名(OpenOfficeのプロセス名:soffice.exeだったかな?)を取得したいのですが、何か良い方法は無いでしょうか? 環境 eclipse3.5 jdk1.5 jooconverter.jar openoffice1.4 やりたいこと ・ExcelからPDFにファイル内容を丸ごと変換(jooconverter.jar、openofficeを使用) ・どうやら、openofficeのコネクタを取得しなければ、変換出来ない為Thrad.sleep()で若干とめてます。 ・その止めるのを毎回ではなく、1日1回若しくはopenofficeが起動していない時だけにしたいのです。 こんな感じでやりたい ~中略~ // プロセス名取得 String pName = …; // openofficeが起動しているかのチェック if (pName.equals("")) {     // openoffice起動     ~中略~ // 処理を一旦停止         Thread.sleep(60000); } // コネクト接続処理 ~中略~ // 変換処理 ~中略~ 補足 何故プロセスIDではないかというと、ネットで調べたら固定ではなく、毎回変動するようなので名前がいいなーと思いました。 もし、変動ではなく固定にすることが出来るなら、IDも可能です。 どなたか分かる方、ご教授頂けましたら幸いです。

    • ベストアンサー
    • Java
  • シェルで親プロセス終了時に子プロセスも終了させるには?

    シェルスクリプトを作っています. 親プロセス(AAA.sh)から子プロセス(BBB.sh)を呼び出した状態で,AAA.shをkillすると,BBB.shのプロセスが終了しないまま,残ってしまうため, http://oshiete1.goo.ne.jp/qa1968135.html を参考にkill -- -$$で同じプロセスグループのものが終了するように作ったのですが,BBB.shが呼び出される前にAAA.shをkillすると,プログラムが暴走してしまいます. どうすれば暴走せずに,親子ともども終了させることができるでしょうか??? *** AAA.sh *** #!/bin/sh func exit_AAA(){ kill -- -$$ exit 1 } trap "exit_AAA" HUP INT QUIT TERM echo "call BBB??(y/n)" read num ./BBB.sh *** BBB.sh *** #!/bin/sh echo "exit BBB?(y/n)>" read num

  • 子プロセスのデータを親プロセスに渡す方法ってありますか。

    こんにちは。 C言語内でfork()関数を使い親と子を分け、子プロセス間で生成されたデータを親プロセス側に渡して処理したいと考えています。要は、プロセス間でデータのやり取りをpipe()関数かなにかで行いたいと思っています。 子プロセスがデータをテキストファイルでどこかに出力して、それを親プロセスが参照する、というテキストファイルを橋渡しにする原始的な方法があるにはあるのですがこれは最終手段にしたいと考えています。他に良いやり方があればご教授いただけないでしょうか。 以下はサンプルコードです。 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<errno.h> #include<signal.h> #include<sys/types.h> int main(){ FILE *fp,*fp2; int fd[2],a,i = 0; pid_t pid; pipe(fd); char buff[1024]; pid = fork(); sigignore(SIGCLD); //ちゃんと子が死ぬようにする if(pid == 0){ close(STDOUT_FILENO); //画面に出力されないようにする dup2(fd[1],STDOUT_FILENO); close(fd[0]); fp = popen("tcpdump","tcpdump","tcp[13] & 255 == 2",NULL); } else{ sleep(1); //一秒だけ子プロセスを起動 kill(pid,SIGTERM); wait(); //完全に子プロセスを殺す fp2 = popen("wc -l fpのファイルデータ","r"); for(i=0;i<3;i++){ a = fgetc(fp2); putc(a,stdout); }printf("\n"); return 0; } } プログラムの内容は、 tcpdumpで処理(子プロセス)した内容を、wc -l で「行数」のみ取得する(親プロセス)というものです。あくまで目標ですが・・。^^; お手数でしょうが、どうぞよろしくお願いします。