複数のマシン(Solaris8)からの情報を1台のマシン(Solaris8)で収集する
プログラムを作成したいのですが、rshではセキュリティの関係上使用出来ません。
そこでプロセス間通信を利用したいと考えております。
まず、複数のマシン上に情報収集用のプログラムを置いておき、1台のマシンから
パラレルにキックをかけて情報収集が出来ないものかお教え下さい。
名前は知っているのですが、方法がわかりません。
この様にすれば可能ですよとか、事例紹介ページ、規正の製品が有ればお教え下
さい。

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

このQ&Aに関連する最新のQ&A

A 回答 (3件)

あなたが知りたい内容はだいたい分かった気がします。



悪いことは言いませんから、まずは、測定プログラムを CGI として実装することを
薦めます。

馬鹿みたいに大きなプログラムじゃない限り、ディスクからのロードなんてたいした
オーバヘッドにはなりません。

まずは、CGI として実装してみて、それでも速度に不満があるようであれば、そこで
はじめて、そのCGI を、情報収集デーモンにすれば良いでしょう。


後々、プログラムを分離することを念頭において CGI をつくるなら、情報の収集と、
それの出力を別関数として実装しておくことが大事です。

CGI の main() がこんな感じになるように。

int main()
{
  収集内容 data;

  data = 情報収集関数(必要な引数);

  情報の出力(data, その他必要な引数);

  return 0;
}

後で、情報収集関数を別プロセスに移すときには、この関数がそのまま使えますし、
この部分がプロセス間通信になるだけですから。


★別プロセスに情報収集を分離したときの CGI

int main()
{
  収集内容 data;

  収集プロセスの起動取得(必要な引数);
  data = 収集を待って情報を取得関数(必要な引数);

  情報の出力(data, その他必要な引数);

  return 0;
}

★情報収集プロセスの main()

int main()
{
  デーモンになるための作法が幾つか…

  while(起動の待合わせ) {
    pid_t pid;
    if ((pid = fork()) == 0) {
      収集内容 data;
      data = 情報収集関数(必要な引数);
      CGIへ収集情報を送信関数(data);
      return 0;
    }
  }

  return 0;
}

という感じになります。

データの待ち合わせをして、ある程度の情報をやり取りする場合のプロセス間通信には
メッセージキューが向いてます。msgget(), msgsnd(), msgrcv() といったシステム
コールを使います。


> 基礎が全くわかっておりません。簡単な例で結構ですのでお教え下さい。
> 本来であれば、この程度の人間がご質問すること自体間違っていることは
> 承知しております。

ここは、分からない人が質問するサイトですから、質問すること自体は間違ってない
んですが、それなりに書くことがあるので、「簡単な例」といわれても書くのが
面倒なんです (^^;
    • good
    • 0
この回答へのお礼

どうも有難う御座いました。大変参考になりました。
又、質問した時にはお助け下さい。<-すぐ質問してしまうかも知れませんが。

お礼日時:2001/12/13 18:12

client は WEB ブラウザなんですか?



> 応答性も考慮する必要があります。このプログラムを常駐させておくとした
> 場合、どのような方法があるのでしようか。

だから、質問に「プロセス間通信」と題をうったのですね。
ディスクからのロードが待てないくらい大きなプログラムなんですか?

ひとつの方法は、プログラムを /tmp や /var/tmp のようなメモリファイルシステム
に配置しておくことですね。

もうひとつは、CGI と daemon になって待ち構えている測定プログラムで
プロセス間通信をすることですね。

# これを聞きたかったのかな?

具体的に何が分からないんでしょう?

・デーモンの作り方が分からない
・プロセス間通信というものが分からない
・プロセス間通信の種類くらいは知っているが、実際にプログラムを組んだことがない


> このプログラムも複数の管理端末から同時にアクセスされる可能性もあり

アクセスが有るたびに、fork() で、測定プログラムの子プロセスを起こせば良い
だけの話だと思うんですが…

この回答への補足

お返事有難うございます。

>もうひとつは、CGI と daemon になって待ち構えている測定プログラムで
>プロセス間通信をすることですね。
その通りです。ご説明の仕方が悪く申し訳ありませんでした。

>・デーモンの作り方が分からない
>・プロセス間通信というものが分からない
>アクセスが有るたびに、fork() で、測定プログラムの子プロセスを起こせば良いだけの話だと思うんですが…

基礎が全くわかっておりません。簡単な例で結構ですのでお教え下さい。
本来であれば、この程度の人間がご質問すること自体間違っていることは
承知しております。

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

補足日時:2001/12/13 14:41
    • good
    • 0

> まず、複数のマシン上に情報収集用のプログラムを置いておき、1台のマシンから


> パラレルにキックをかけて情報収集が出来ないものかお教え下さい。

socket 通信のように、情報収集する側でプログラムを立ち上げておきたくない、と
いうことなのでしょうか?

情報を集める複数のマシンに何が入っているのか知りませんが、HTTP で CGI を
起動する、というのでは駄目ですか?

あと、

> rshではセキュリティの関係上使用出来ません。

が、どこまでを問題にしているか、によりますが ssh を使う、という手もありますね(→参考URL)。

参考URL:http://www-ccce.kek.jp/People/yashiro/Rep.euc/KE …

この回答への補足

早速のお返事有難うござます。

おっしゃる通りのことを実現したいのです。

Web画面(管理端末)から、対象となるホスト(複数の場合有り)を指定し
サブミットすることにより、対象となるホストに置いてあるプログラム
(情報収集用)を起動させ、結果を管理端末画面に表示するというものです。
このプログラムも複数の管理端末から同時にアクセスされる可能性もあり
応答性も考慮する必要があります。このプログラムを常駐させておくとした
場合、どのような方法があるのでしようか。

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

補足日時:2001/12/13 12:46
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QLinuxでのスレッド間メッセージについて

Linuxでスレッドを複数生成し、スレッド間でメッセージのやり取りをしたいと思っています。

ネットで色々検索したのですが、欲しい情報にめぐり合えていません。
# WindowsのPostThreadMessage()みたいなものを探しています。
#「プロセス間通信」というものは発見しましたが・・・

何か方法はありますでしょうか?
スレッド間のメッセージのやり取りの方法がない場合は代替案も教えて頂きたいです。
# セマフォを用いて共有メモリアクセスかな?と思っています。

Aベストアンサー

pthreadでは、排他や条件セマフォ等はありますが、メッセージ交換のAPIはありません。おそらく多くの人はプロセス間通信を用いているのではないでしょうか?
ただし、posixのメッセージキューは、実装により1プロセスがオープンできる数が著しく(32個とか)制限されていますし、SystemVのメッセージもOSの初期設定値が著しく低い値が設定されていたりして、現代的なマルチスレッドの設計には向いていないかもしれません。また、UNIXは所有者プロセスがいなくなってもリソースが残ってしまいますので、正直使いづらいです。

プロセス内でのみのメッセージ交換なら、pthreadとSTLなどを組み合わせてキューをつくることも考えられます。軽量で高速なキューの実装が可能です。とりあえず実装することは難しくないのですが、デッドロック等に十分に注意して実装してください。共有メモリにおけば、プロセス間通信も可能でしょう。

もうひとつは、パイプもしくはソケットを用いる方法が考えられます。UNIXではこれが一般的だろうと思われます。UNIXドメインのソケットを用いればポートをバインドする必要もありません。ソケットをラップして、キューライクなインターフェースにすることも可能でしょう。ただし、UNIXドメインのソケットがWindowsにないので、ポーティング・ソース共有が少し面度くさくなります。

あとは、メッセージキューイング製品を用いることも選択肢としてはあります。コスト的に許されればの話ですが。オープンソースもなくはないですが、試してみたことはないです。

といったところでしょうか。

ちなみにWindowsもプロセス間/スレッド間で用いるメッセージキューがありませんね。代わりにウインドウメッセージキューを用いることもありますが、信頼性が低い(Win3.1のころは最悪でした)。ウインドウを持たないスレッドに必ずウインドウメッセージキューを作成するあたりも少し不満が残ります。名前付きでオープンできないですし。代わりにmailslotをラップしてキューを実装してりしていました。最近はMSMQという選択肢もありますが。javaでもconcurrentパッケージがJDKに入ったのは最近ですし、こっちはプロセス間通信ができません。

世の中ではメッセージ交換方式のプログラミングがなかなか普及しないみたいで、各プラットフォームでいつも悩まされます。

pthreadでは、排他や条件セマフォ等はありますが、メッセージ交換のAPIはありません。おそらく多くの人はプロセス間通信を用いているのではないでしょうか?
ただし、posixのメッセージキューは、実装により1プロセスがオープンできる数が著しく(32個とか)制限されていますし、SystemVのメッセージもOSの初期設定値が著しく低い値が設定されていたりして、現代的なマルチスレッドの設計には向いていないかもしれません。また、UNIXは所有者プロセスがいなくなってもリソースが残ってしまいますので、正直使い...続きを読む

Qmsgget()で指定するkey値について

solaris9上でメッセージキューを使用したCプログラム
を作成するのですがmsgget関数で不明点があります。
尚、コンパイラはSUNのForte Cです。

int msgget(key_t key, int msgflg);

第一引数のkeyに指定する値ですが、サーバ内の開発
プログラム全体で重複しないようにするのは当然かと
思いますが、OSで予約されている番号とかあるので
しょうか?

例えば
 0~999:OSで使用
 1000番以降:ユーザアプリで利用可

OSでもメッセージキューとか使用していると思うので
適当な番号を取ったらダメだろうなと思って色々調べた
のですが解決する事ができませんでした。

すみませんがご教授の程よろしくお願い致します。

Aベストアンサー

通常、keyを生成する場合は、以下の手順をとります。
1.ftok関数でkey値を取得する。
key値=ftok(p1,p2);
p1は、ある基準となるファイルの絶対パス名(以下基準ファイルと略記)
p2は1~255の任意の数値
上記により、同一の基準ファイルに同一のP2を与えた場合は、本システム内でかち合わないユニークなキー値
を発生させることをOSが保証します。
2.従って、以下のようにします。
P1へ基準ファイルの絶対パス名をセット
key1=ftok(p1,1);・・・メッセージキュー1用
key2=ftok(p1,2);・・・メッセージキュー2用(以下同様、但しMAX255迄)
但し、key1,key2が-1の場合は、ftokのエラーのため、使用不可(このチェックを入れて下さい)
また、この基準ファイルは、絶対に更新しないで下さい。(タイムスタンプが変わると同一のキー値が得られません)又、このファイルを毎回かならず使用して下さ
い。
3.あとはこのkey1,key2・・を使ってmsggetを行って下さい。

Qメッセージキューのスレッド間通信 

linuxは全くの初心者なんですが、仕事でメッセージキューでスレッド間通信をするツールを作成するよう指示を受けたのですが全くわかりません。プロセス間通信をするツールは調べて何とかなったんですが…

そもそもスレッド間通信ということがわからず困っていますので、ご教授願います。
簡単ものでいいのでツールについても教えていただけたら幸いです。

Aベストアンサー

スレッド間通信でも、プロセス間通信で使用する read()、write() を使って実装することは出来ます。
メッセージキューを利用したサンプルは、ここに掲載されていましたが、
・並列プログラミング - メッセージキュー (1)
http://linuxmag.sourceforge.jp/Japanese/March2003/article287.shtml
もっともこれは、スレッド間通信特有のものではなく、プロセス間通信で使用するものです。
なお、スレッドは複数存在していても、元は同じプロセスですから、グローバル変数やスタティック変数をそのまま参照することが出来ます。スタティック変数としてキューバッファを定義し、それを扱う関数(メソッド)を実装すれば、スレッド間通信が実現できます。但し、スレッド間で競合が起きないよう、これらの変数にアクセスする場合は、pthread_mutex_lock() や pthread_mutex_unlock() で保護する必要がありますが。

QC++/CLIで、アンマネージC++のDLLを使用する方法

こんにちは。
C++/CLIのプログラムで、アンマネージC++のDLLを使用したいと考えています。
ネット上をいろいろ調べたのですが、具体的な手段がわかりません。
見よう見まねで以下のようにサンプルを作成したのですが、コンパイルすら通る状況になりません。
かなり基本的な問題がありそうで申し訳ないのですが、下記の問題点を教えていただけないでしょうか。

また、参考になりそうなサイトなどありましたら教えていただけると大変助かります。

■アンマネージC++のDLL
VC++6.0で、以下のように、単にデバッグ文字列を書き出すだけのDLL関数を作成しました。
(このDLLが使用できることは他のVC++6.0プロジェクトで確認済みです)
/*-----Func.h-----*/
#ifndef __FUNC_H__
#define __FUNC_H__

AFX_EXT_CLASS void WINAPI ShowMessage();

#endif//__FUNC_H__

/*-----Func.cpp-----*/
#include "StdAfx.h"
#include "Func.h"
#include <stdio.h>

void WINAPI ShowMessage()
{
CString str = "This is The Message from DLL Func!\n";
OutputDebugString(str);
}

■C++/CLI でのDLL使用
Visual Studio2008にて、C++のCLRプロジェクトを作成して、以下のようにDLLを使用する準備を行いました。
1.ソリューションエクスプローラのヘッダフォルダに、Func.hを追加
2.プロジェクトのフォルダに、上記で作成したFuncのDLLとLIBファイルを置く。
3.プロジェクトの「プロパティ > C/C++ > プリプロセッサ > プリプロセッサの定義」に、"_AFXDLL"を追加
4.mainクラスのソースに以下を記述
/*----------*/
using namespace System;
#include "Func.h"
#using "ManagedDllApp.dll"

int main()
{
ShowMessage();
return 0;
}
/*----------*/

この状態でコンパイルすると、
「エラー3error C2144: 構文エラー : 'void' は ';' によって先行されなければなりません。d:\xxx\Func.h4Console
」等、Func.h周りで複数のエラーが出ます。
また、Func.hをインポートしないでコンパイルすると、
「エラー3fatal error C1113: #using が 'd:\xxx\manageddllapp.dll' で失敗しました。」と、Dllでエラーが出ます。

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

こんにちは。
C++/CLIのプログラムで、アンマネージC++のDLLを使用したいと考えています。
ネット上をいろいろ調べたのですが、具体的な手段がわかりません。
見よう見まねで以下のようにサンプルを作成したのですが、コンパイルすら通る状況になりません。
かなり基本的な問題がありそうで申し訳ないのですが、下記の問題点を教えていただけないでしょうか。

また、参考になりそうなサイトなどありましたら教えていただけると大変助かります。

■アンマネージC++のDLL
VC++6.0で、以下のように、単にデ...続きを読む

Aベストアンサー

 こんばんは。御礼頂きました。
 Func.hの中にインクルードし忘れがある様です。準備が出来たら、必ず「ソリューションのリビルド」をして下さい。
 以下は DLL->VC6.0Pro CLR->VC2005Pro で確認しています。

/*-----Func.h-----*/
#ifndef __FUNC_H__
#define __FUNC_H__

#include"afxver_.h"//此れと
#include"afxv_dll.h"//此れと
#include<windows.h>//此れをインクルード

AFX_EXT_CLASS void WINAPI ShowMessage();

#endif //__FUNC_H__

//以下はCLRアプリ側

/*-----stdafx.h-----*/
// stdafx.h : 標準のシステム インクルード ファイルのインクルード ファイル、または
// 参照回数が多く、かつあまり変更されない、プロジェクト専用のインクルード ファイル
// を記述します。
//
#pragma once

// TODO: プログラムに必要な追加ヘッダーをここで参照してください。
#include"func.h"
#pragma comment(lib, "libの名前.lib")

/*-----clrconsole.cpp-----*/
// clrconsole.cpp : メイン プロジェクト ファイルです。

#include "stdafx.h"

using namespace System;

int main(array<System::String ^> ^args)
{
::ShowMessage();
return 0;
}

 こんばんは。御礼頂きました。
 Func.hの中にインクルードし忘れがある様です。準備が出来たら、必ず「ソリューションのリビルド」をして下さい。
 以下は DLL->VC6.0Pro CLR->VC2005Pro で確認しています。

/*-----Func.h-----*/
#ifndef __FUNC_H__
#define __FUNC_H__

#include"afxver_.h"//此れと
#include"afxv_dll.h"//此れと
#include<windows.h>//此れをインクルード

AFX_EXT_CLASS void WINAPI ShowMessage();

#endif //__FUNC_H__

//以下はCLRアプリ側

/*-----stdafx.h-...続きを読む

Qパイプを用いたプロセス間通信について

VC++2005にて下記サイトを参考にパイプを用いたプロセス間通信を行うプログラムを作成しています。

猫でもわかるプログラミング
(1)第242章 匿名パイプ(サーバー側)
http://www.kumei.ne.jp/c_lang/sdk3/sdk_242.htm
(2)第243章 匿名パイプ(クライアント側)
http://www.kumei.ne.jp/c_lang/sdk3/sdk_243.htm

サーバー側からWriteFileでデータを送信する際に、
char型配列に入ったバッファデータ「szBuf」を送信し、
クライアント側のReadFileで同じく「szBuf」で受信していますが、
構造体Data
==================
typedef TypeData{
int a;
int b;
char c[10];
}Data;
==================
のオブジェクトdataを送信するには、WriteFile及びReadFileの箇所は
どのように実装すれば良いのでしょうか?
MSDNにはWriteFileの引数の型はLPCVOIDとあるため、
可能だと思うのですが。。。
もし解決策をご存知の方おられましたら、ご教示お願い致します。

VC++2005にて下記サイトを参考にパイプを用いたプロセス間通信を行うプログラムを作成しています。

猫でもわかるプログラミング
(1)第242章 匿名パイプ(サーバー側)
http://www.kumei.ne.jp/c_lang/sdk3/sdk_242.htm
(2)第243章 匿名パイプ(クライアント側)
http://www.kumei.ne.jp/c_lang/sdk3/sdk_243.htm

サーバー側からWriteFileでデータを送信する際に、
char型配列に入ったバッファデータ「szBuf」を送信し、
クライアント側のReadFileで同じく「szBuf」で受信していますが、
構造体Da...続きを読む

Aベストアンサー

>Data* data;
>ReadFile(hRead, (LPVOID)data, sizeof(data), &dwResult, NULL);
構造体の実体はmalloc()等で作ってありますか?
補足のコードのままだとすると、dataの中身はNULL(あるいはゴミ)になっているのでエラーになって当然です。
////////
Data* data;
data = malloc(sizeof(data));
ReadFile(hRead, (LPVOID)data, sizeof(data), &dwResult, NULL);
////////
あるいは、ポインタを使わずに次のようにしてもいいです。
Data data;
ReadFile(hRead, (LPVOID)&data, sizeof(data), &dwResult, NULL);
※WriteFileの方も、dataはポインタではないと思うのですが...


人気Q&Aランキング

おすすめ情報