子プロセスの生成

解決


ぺぺ  2006-01-30 11:02:46  No: 60600  IP: [192.*.*.*]

子プロセス生成でどのような関数を使用すればよいか分からなく
困っています。

処理内容としては、親プロセスから子プロセスを生成して、
子プロセスを使って、ある関数の処理を実行したいのですが‥。

CreateProcess()かな〜と思いながら調べていますが、
コマンドパスを指定するインターフェイスがあっても、
関数のポインタを登録するインターフェイスが無さそうに見えるのですが‥。

どの関数を使用したらよいのでしょうか?
ご教授いただきたく、お願い致します。

環境:VC++6.0 Windows2000

編集 削除
tetrapod  2006-01-30 11:40:49  No: 60601  IP: [192.*.*.*]

子プロセスを起動して、その中の関数を呼びたい、ってことでしょうか?
ソレは無理。意味ないし。インターフェイスが無くて当然。
呼びたいのは DLL でしょうか?それなら LoadLibrary+GetProcAddress

編集 削除
επιστημη  2006-01-30 11:58:59  No: 60602  IP: [192.*.*.*]

プロセス? それとも スレッド?
スレッドなら CreateThread

編集 削除
Toshi  2006-01-30 12:07:42  No: 60603  IP: [192.*.*.*]

他の方が不思議に感じてる様に、私も不思議な質問だと感じています。
多分、何か発想からして思い違いをしてるんじゃないかしら・・的な。

が、取り合えずやりたい事を「推測」して見るならば、
多分、別プロセスを起動して、特定の条件でやらせる事を分岐させたいと言う事なのかな?
もしそうなら、子プロセスで実行される実行ファイルは起動パラメータを受け取るようにしておいて、子プロセスの方ではプロセス起動時にパラメータを貰って処理を分岐させればいいのでは無いでしょうか。

編集 削除
ぺぺ  2006-01-30 13:36:09  No: 60604  IP: [192.*.*.*]

質問の意図が不明確であったようで、申し訳ありません。

具体的な処理を言うと、ダイアログのボタンを押したときの処理なのですが、

①親プロセスが子プロセスを生成
②親プロセスが子プロセスの処理が終了するまで、
「サーバからファイル取得中」ですとういうダイアログ(メッセージボックスでもよい)を表示
③子プロセスは、ファイルの取得処理を実行
④親プロセスは子プロセスの終了を確認したら、②のダイアログの表示を終わらせる。そのとき、子プロセスのエラーコードを受け取る。

という処理を考えています。いつか問題点はあるかと思います。
まずは先ほど質問させて頂いた点と
④の処理中でダイアログの表示を終わらせるっていう点でしょうか。

※③の処理については、Linuxからの移行部分なのですが、
  fork()と同様な関数がないか調べていた為、質問させていただきました。

っと、書きながら思ったのですが、
親プロセスと子プロセスの処理を逆にして、子プロセス(exeファイル)で
ダイアログ「サーバからファイル取得中」を表示させたら解決しそうな気がしてきました。
が、最終的に子プロセスをKILLするにはどうすればよいのか〜(考中)

クライアントの経験が無い為、長々なってすいません。
上記の処理に対して、なにかアドバイスいただけたら幸いです。

プロセス・スレッドに関しては、できたらプロセスが良いですが、
もうあまりこだわりません。  よろしくお願い致します。

編集 削除
Ban  2006-01-30 14:14:19  No: 60605  IP: [192.*.*.*]

# 丸付き数字は機種依存なので、掲示板には不適切です。

> fork()と同様な関数がないか調べていた為、質問させていただきました。

ずばり、と言うのはありません。(差分を実装するとCygwinみたいになる?

マルチプロセスならCreateProcessでよいですし、
マルチスレッドにするなら CreateThread/beginthread/AfxBeginThread等。
# どれがよいかは、環境次第(MFC使用の有無とか)で使い分けてください

(4)は、WaitForSingleObject(or WaitForMultipleObjects で終了待機して、
GetExitCodeProcess でしょうか。
親プロセスでメッセージ処理をまわし続けるなら、この待機のために結局
待機用スレッドを用意することになるかもしれません。


> イアログ「サーバからファイル取得中」を表示させたら解決しそうな
> 気がしてきました。
> が、最終的に子プロセスをKILLするにはどうすればよいのか〜(考中)

この方向なら、ダイアログ表示している子プロセスに、終了依頼の
メッセージを PostMessage / SendMessage すればよいかと。

編集 削除
ぺぺ  2006-01-30 20:06:31  No: 60606  IP: [192.*.*.*]

Banさん、皆さんご回答ありがとうございます。

すいませんが、いくつかご質問させてください。

>親プロセスでメッセージ処理をまわし続けるなら、この待機のために結局
>待機用スレッドを用意することになるかもしれません。
というのは、具体的どういうことでしょうか?

またCreateProcess()を使用するには、子プロセス用の
別の実行ファイルが必要なるということでよろしいでしょうか?

fork()ならば、下記のように子プロセスの処理を組み込むことはできますが、
処理を組む込もうと思ったら、
やはりCreateThread()で関数を引き継ぐしかできないということになるのでしょうか?
確認させてください。お手数おかけしますが、よろしくお願い致します。

switch(pid=fork()){
case    0:      /* child */
    counter();
    exit(0);
case    -1:
     perror("fork");
     break;
default:        /* parent */
     printf("[%d]child pid = %d\n",p_pid,pid);
     break;
}

編集 削除
Ban  2006-01-30 20:56:34  No: 60607  IP: [192.*.*.*]

>親プロセスでメッセージ処理をまわし続けるなら、この待機のために結局
>待機用スレッドを用意することになるかもしれません。
というのは、具体的どういうことでしょうか?

WaitFor〜を使うと、その実行単位はブロッキングします。
ダイアログなどウィンドウを持つ実行単位では、システムメッセージを処理する
「メッセージループ」をまわしていないと、画面が固まってしまいます。
通常、プロセス終了を待つ場合には、親プロセス内に待機用スレッドが必要になります。
# GetExitCodeProcess でポーリングする等の方法はあります。

> またCreateProcess()を使用するには、子プロセス用の
> 別の実行ファイルが必要なるということでよろしいでしょうか?

基本的にはそうです。
# あくまでも実行ファイルを単一にしたいなら、例外的手法だとは思いますが、
# 特定の起動引き数があるか否かで処理分岐するようにした自プロセスを呼び出すとか.....?

編集 削除
ぺぺ  2006-01-30 22:13:32  No: 60608  IP: [192.*.*.*]

Banさんご回答ありがとうございます。
おかげ様でとても勉強になります。

ただ個人的に、まだプロセス間・ダイアログ関係のことに
知識不足を感じました。このあたりネット等で調べて、
当初述べました処理の流れを熟考したいと思います。

まずは、題記で挙げました質問事項に関して解決しましたので、
解決とさせていただきたいと思います。
ありがとうございました。m(_ _)m

編集 削除