• ベストアンサー

ソケットディスクリプタを別プロセスで使いたい

プロセスAで作成したディスクリプタをプロセスBで使いたいのですが 別プロセスへディスクリプタを関連付けたりって出来るのでしょうか? Aで作成->Bで使えるようにする->Aをクローズ->Bで使う このようにしたいです。

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

  • ベストアンサー
  • chirubou
  • ベストアンサー率37% (189/502)
回答No.1

fopk() や exec() で渡すというのではなくて、ということですよね?出来るか出来ないかは完全に OS 依存です。 例えば Linux だと、ソケットに限らず任意のファイル記述子を、あるプロセスから別なプロセスに Unix ソケット経由で渡すことができます。ちょっとトリッキーというか、すこしプログラムが面倒ですが。 参考 URL のページ中程、「例をあげると、 Linux はこの補助データのメカニズムを、 Unix ソケット上での拡張エラーや IP オプション、 ファイル・ディスクリプタの受け渡しに利用している」とあります。私は実際に使っています。 もちろん、同じホスト内でのプロセス間での話で、Inet のソケットではできません。

参考URL:
http://www.linux.or.jp/JM/html/LDP_man-pages/man2/recv.2.html
herbest
質問者

お礼

すみません、なかなか時間が取れなくて試せていません。 やり方が少しややこしいので、今後ログを読む人の為に解決法を書いて締め切ろうと思っていたのですが、 あまり放置するのは回答して頂いた方に失礼ですのでひとまず終わらせて頂きます。 おそらく回答いただいたUnixソケットの機能の一部を利用する事で解決出来そうです。 お礼が遅くなりすみません。

herbest
質問者

補足

おおお、ソケットでそんな物まで渡せるとは。 OSというか実行環境はcygwin上なので多分行けると思います。ちょっと試してみます。 forkやexecで渡す、と言うのはfork()"前"にディスクリプタを作るとう事ですよね。 今回はforkした"後"に親プロセスで作ったのを子プロセスで使用したいので、最初から 別プロセスという考えでいます。

関連するQ&A

  • 別のプロセスの関数を呼び出す方法はありますか?

    別のプロセスの関数を呼び出す方法はありますか? WINDOWSでプロセスAとプロセスBがあり、 プロセスBの関数ポインタをプロセスAで取得するところまではできるのですが、 この後、プロセスAからプロセスBの関数をコールバックする方法はありますか? アドレス空間はプロセスごとに固有であるため、 通常のコールバックではうまくいかないと思うのですが・・・。 尚、プロセスAとプロセスBは、異なるプログラムです。

  • エクスプローラから開かれるWordを別プロセスにするには

    VC++2008にてプログラムを作成しています。 自作プログラム(疑似エクスプローラ)にて、 WordやExcelファイルをCreateProcessにて オープンし、WaitForSingleObjectにて ファイルが閉じられるまで待機。 ファイルが閉じられたら、終了処理という流れのシステムを 作成しています。 自作プログラムからオープンする際は、 Officeのコマンドラインオプションを用いて 別プロセスで起動するようにしていますので、 自作プログラムからWord(またはExcel)ファイルを 複数開いても、個別プロセスになるので、 各ファイルが個別に終了処理を行えるようになっています。 (なっていると思っていた) 問題は、自作プログラムからWord(a.doc)を開き、 エクスプローラから別ファイルのWord(b.doc)を開いた際、 b.docは個別にプロセスが作成されず、 a.docで作成した1プロセスにまとめられてしまうことです。 そのため、a.docを閉じても、b.docが開いている限り、 終了処理に移行しません。 APIフックにて、CreateProcessを引っ掛けてみたのですが、 エクスプローラからのファイルオープン時には 呼ばれていないようで、自作プログラム外で ファイルオープンをした際に、強制的に独自プロセスで 起動する方法が分りません。 自作プログラム起動時に限り、Word,Excelのファイルを 独自プロセスで開かせたいのですが、 解決方法はありますでしょうか? よろしくお願いします。

  • 別プロセスのコントロールにフォーカスをあてたい

    VC++5.0 または VC++6.0 の環境で、MFC を使ってダイアログベースの EXEを造っています。 (OS は NT4.0 または 2000 です) 以下のことをしたいと思っています。 ・プロセスA、Bがあります。 ・プロセスAがプロセスBをフォアグランドにします。 →SetForegroundWindow() します。 ・プロセスAがプロセスBのボタンやエディットボックスなどのコントロールに フォーカスをあてる。 で、この最後のフォーカスをあてる処理は実現可能でしょうか? 自分のプロセス内のコントロールに対しては、SetFocus() で フォーカスをあてられたのですが、別プロセスではフォーカスを あてることができませんでした。 識者の方、ご教授願います。

  • サーバプロセスとクライアントプロセスの通信

    サーバプロセスとクライアントプロセスの通信がどのように行われているのか確認させてください。 現在、以下の認識でいます。 (1)TCPコネクション  サーバ側ポート番号【23】と、それぞれのクライアント側ポート番号【****】との間に確立する。   (2)通信処理  クライアント側のプロセスAは、サーバ側のプロセスA(子)  クライアント側のプロセスBは、サーバ側のプロセスB(子)  クライアント側のプロセスCは、サーバ側のプロセスC(子)  との間で通信を行う。 ※添付の図も参照ください。 認識に相違ないでしょうか。 サーバプロセスとクライアントプロセスの通信を行う際、プロセス間(ポート間?)の通信には、IPアドレスとポート番号を組み合わせたソケットを用いるため、サーバ側ではソケット【192.168.0.1:23】を1個作成し、クライアント側ではソケット【192.168.0.2:****】をプロセス分作成すると考えています。 このとき、クライアントプロセスAはサーバプロセスA(子)と通信を行いますが、サーバ側で作成されているソケットは1つであるため、どの子プロセスに対してデータをせばいいのか判別できないのではないかと考えています。 ※クライアントプロセス(A、B、C)はソケット(サーバ側)【192.168.0.1:23】に対して送信されるため。 上記について、何らかの仕組みがあるのでしょうか。 よろしくお願いします。

  • POSIX メッセージキュー作成時の払い出しディスクリプタ

    現在、Linux(Fedora 7)の環境でPOSIXのメッセージキューを用いたプロセス間通信のプログラムを作成しています。 mq_openでメッセージキューをオープンしているのですが、 異なるプロセスですでに開かれているキューをオープンした時に、 最初にオープンしたキューと異なる値のディスクリプタが払い出されてしまいます。(その際のディスクリプタの値は他のキューの値になっていたりもします。) 例) <プロセスA(プロセスBより先に実行)> mqd = mq_open(   "/sample001", O_RDWR|O_CREAT, S_IRWXU, &mqattr); printf("Process A mqd = %d", mqd); <プロセスB> mqd = mq_open("/sample001", O_RDWR); printf("Process B mqd = %d", mqd); <実行結果> Process A mqd = 10 Process B mqd = 14 何か心当たりはありませんでしょうか?

  • プロセスのハンドルを確保

    AプログラムからBプログラムを起動するプログラムを作成しています。 AはループでBプログラムを起動するのですが、Aでプロセスの起動数をチェックし、飽きのプロセスハンドルを確保しBプログラム意を起動する際にAで確保したハンドルを使用して起動するような処理をするにはどうしたらいいでしょうか? 例:プロセス最大起動数:5   Aは10回ループし、Bを起動する。   Aでプロセスハンドルを5個確保する。   Bを起動する際に確保したハンドルを1個使用する。   Bが終了したらハンドルを解放する。   

  • 外部プロセス起動時に発生するエラーについて

    外部プロセス起動時に発生するエラーについて お知恵を拝借させてください。 あるプロセス(以下A)から同一端末上の別プロセス(以下B)を起動する場合に、 エラーが発生します。 エラーの内容は、参照オブジェクトが作成されていないという内容です。 このエラー自体については納得はできるのですが、 プロセスBの直接起動の場合、このエラーは発生せず、正常に動作します。 別プロセスからの起動と、直接起動で、 内部的な動作の違いがあるのかもと想像しているのですが、 確認の方法がわからず、困っています。 解決の為の方法、ヒントか糸口など、 もしご存知の方がいらっしゃいましたら教えていただきたいのです。 プロセスA、B双方ともVB2008による開発です。 よろしくお願いします。

  • 別プロセスの起動

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

  • 別プロセス、別ポートで Apache を起動すると、php が実行されない

    別ポートで複数(二つ)の apache を常駐されようとしています。 正常にPHPのページが見れている Apache (以下 A) の設定ファイルの Listen ErrorLog CustomLog のディレクティブを変更したものを別ファイルに保存(以下 B.conf)し、B.conf を設定ファイルとする Apache (以下 B)を起動しました。 二つのプロセスが動いており、B.conf で指定したポートで http アクセスできる事も確認しました。 しかし、php Aから見ることのできる php ファイルが、 Bからでは見れません(ソースが表示されます)。 このような場合における解決策を教えていただけませんでしょうか。

    • 締切済み
    • PHP
  • fork()で作られた子プロセスから親プロセスの生存を知る方法は?

    タイトルの通りなのですが、プロセスAから fork()で子プロセスBを作り、Bには無限ループで処理をさせます。 Aはユーザからの入力を受け、処理を行います。 Aが終了要求をされプロセスを終了するときに、 Bも同時に終了したいのですが、BからAの生存を判定して Aのプロセスが切れていたBも終了する、ということは可能でしょうか? Bの無限ループ処理では、ファイルの書き換えを行っているので AからBのPIDを指定してKillする、ということはせずに B自身で判定して終了するようにしたいのですが。。

専門家に質問してみよう