3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

日本語プログラミング言語Mindの小技 「子プロセス終了?」~非同期実行と終了検知2~

Last updated at Posted at 2025-08-15

はじめに

日本語プログラミング言語Mindの小技「子プロセス終了?」について説明したいと思います。

対象読者

日本語プログラミング言語Mindのユーザー、または日本語プログラミング言語に興味のある方

この小技に関連するMind言語マニュアル

この小技に関連するMind言語仕様の記述はMind8プログラミングマニュアルに記載がありません。(今後できるようです。)

Mind7の付属の上級者向けドキュメントmind7\doc\guiprog.docmに記載があります。

G2. Tcl/TkとMind
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

■自動的に「一つのイベントを処理」が行われるもの
 以下のMind単語を使うと、その内部で「一つのイベントを処理」が呼ばれ、
Tcl/Tkに制御が渡るため、利用者の側でそれを行なう必要はありません。
~略~
  ・「子プロセス終了?」
~略~

本機能(本記事)は、下記のバージョンに対応しています。Mind8のLinux版も対応していると思いますが、本記事では特に検証を行っておりません。

対応バージョン

■Mind7 ■Mind8 ■Mind9
■Windows版 □Linux版

小技の解説

Mindの小技「子プロセス終了?」はMindいくつかある外部プログラムの起動処理の一つである「子プロセス起動」に関連した機能です。「子プロセス起動」に関連する詳細は、下記の記事に記載されています。

以下は上記の記事と説明内容が重複しますが、本記事だけでも概要ご理解いただけるよう再掲しました。

「子プロセス起動」では、起動した外部プログラムが終了するのを待たず、起動したMind側のプログラムコードは処理を続行します。いわゆる非同期的に実行するの類となります。同期的に外部プログラムを実行する処理単語もありますが、本記事対象外です。

「子プロセス起動」では、起動した外部プログラムの「プロセスID」がスタックに積まれますので、それを拾っておいて(変数に格納しておいて)、「子プロセス終了を待つ」または「子プロセス終了?」の処理単語で終了を検知することができます。

「子プロセス終了を待つ」 対象「プロセスID」の外部プロセスが終了するまで待機します。
「子プロセス終了?」   対象「プロセスID」の外部プロセスが終了しているかをチェックします。

前者は起動した外部プログラムが終了するのを待ちます。チェックしたMind側のプログラムコードは処理を待機します。いわゆる同期的に実行するの類となります。
後者は起動した外部プログラムが終了するのを待たず、チェックしたMind側のプログラムコードは処理を続行します。いわゆる非同期的に実行するの類となります。

本記事は非同期に起動した外部プログラムの終了を検知する上記2つの方法のうち、非同期に検知する方法について解説します。同期的な検知は前記参考記事を参照してください。

以下のサンプルプログラムでは、親側プログラム、子側プログラムの双方をMindで記述して説明します。

Mindプログラムソース

親側

asynChildprocessP3.src
メインとは  (・ → ・)
        プロセスID0は 変数
        プロセスID1は 変数
        プロセスID2は 変数
        プロセスID3は 変数
        終了フラグ0は 変数
        終了フラグ1は 変数
        終了フラグ2は 変数
        終了フラグ3は 変数

※ローカル処理単語定義 ここから

 全ての子プロセスを起動するとは (・ → ・)   
 
    "asyncChildprocessD"を 子プロセス起動し プロセスID0に 入れ
    エラー?
  ならば 
        「子プロセス起動エラー0:」を 表示し エラー表示し
    さもなければ 
        「プロセスID0:」を 表示し プロセスID0を 数値表示し 改行し 
  つぎに
    "asyncChildprocessC1"を 子プロセス起動し プロセスID1に 入れ
    エラー?
  ならば 
    「子プロセス起動エラー1:」を 表示し エラー表示し 改行し
    さもなければ
    「プロセスID1:」を 表示し プロセスID1を 数値表示し 改行し
  つぎに
    "asyncChildprocessC2"を 子プロセス起動し プロセスID2に 入れ 
    エラー?
  ならば 
    「子プロセス起動エラー2:」を 表示し エラー表示し 改行し
    さもなければ
    「プロセスID2:」を 表示し プロセスID2を 数値表示し 改行し
  つぎに
    "asyncChildprocessC3"を 子プロセス起動し プロセスID3に 入れ
    エラー?
  ならば 
    「子プロセス起動エラー3:」を 表示し エラー表示し 改行し
    さもなければ
    「プロセスID3:」を 表示し プロセスID3を 数値表示し 改行し
  つぎに

 全ての子プロセスの終了を都度検知するとは (・ → ・)
    終了フラグ0を クリアし
    終了フラグ1を クリアし
    終了フラグ2を クリアし
    終了フラグ3を クリアし
    ここから
    「親プロセス実行中です。」を 一行表示し
    
    終了フラグ0が 偽?
    ならば
        プロセスID0で 子プロセス終了?
		ならば 終了フラグ0を セットし
     	    「プロセスID0の子プロセスの終了パラメータ:」を 表示し 改行し 
            子プロセスの終了パラメータを 数値表示し 改行し    
		つぎに
    つぎに
    終了フラグ1が 偽?
    ならば    
	プロセスID1で 子プロセス終了?
		ならば  終了フラグ1を セットし
    	    「プロセスID1の子プロセスの終了パラメータ:」を 表示し 改行し 
            子プロセスの終了パラメータを 数値表示し 改行し    
		つぎに
    つぎに
    
    終了フラグ2が 偽?
    ならば
        プロセスID2で 子プロセス終了?
		ならば   終了フラグ2を セットし
            「プロセスID2の子プロセスの終了パラメータ:」を 表示し 改行し    
            子プロセスの終了パラメータを 数値表示し 改行し
        つぎに
	つぎに

    終了フラグ3が 偽?
    ならば
        プロセスID3で 子プロセス終了?
		ならば   終了フラグ3を セットし
            「プロセスID3の子プロセスの終了パラメータ:」を 表示し 改行し    
            子プロセスの終了パラメータを 数値表示し 改行し
        つぎに    
    つぎに
        
    終了フラグ0が 真? かつ
    終了フラグ1が 真? かつ
    終了フラグ2が 真? かつ
    終了フラグ3が 真?
    ならば 打ち切り
    つぎへ
     
    10で 十ミリ秒単位待ち
    
    繰り返すこと

※ローカル処理単語定義 ここまで

 本体とは (・ → ・)
   「親プロセス実行開始しました。」を 一行表示し

  全ての子プロセスを起動し
  全ての子プロセスの終了を都度検知し

    「親プロセス実行終了しました。」を 一行表示すること。

"asyncChildprocessD"というプログラムは存在しませんので、意図的に起動エラーが起きることを想定しています。

一度終了が確認された後は、チェックの重複を避けるため終了判定の前に終了フラグの判定を入れています。

asynChildprocessP3.src
    終了フラグnが 偽?
    ならば
        ~終了判定~
    つぎに

記述量が長くなったため、プロセスIDと終了フラグを共有する局所処理単語で記述しています。局所処理単語につきましては下記の記事に解説が詳しくあります。

子側

asynChildprocessC1.src
メインとは  (・ → ・)
    「子プロセス1実行開始しました。」を 一行表示し
   10で 回数指定し
        「子プロセス1実行中です。」を 一行表示し
        10で 十ミリ秒単位待ち
    繰り返す
    「子プロセス1実行終了しました。」を 一行表示し
    終了パラメータに -1を 入れること。 
asynChildprocessC2.src
メインとは  (・ → ・)
    「子プロセス2実行開始しました。」を 一行表示し
    4で 回数指定し
        「子プロセス2実行中です。」を 一行表示し
        10で 十ミリ秒単位待ち
    繰り返す
    「子プロセス2実行終了しました。」を 一行表示し
    終了パラメータに -2を 入れること。    
asynChildprocessC3.src
メインとは  (・ → ・)
    「子プロセス3実行開始しました。」を 一行表示し
    2で 回数指定し
        「子プロセス3実行中です。」を 一行表示し
        10で 十ミリ秒単位待ち
    繰り返す
    「子プロセス3実行終了しました。」を 一行表示し
    終了パラメータに -3を 入れること。    

それぞれ反復回数と終了パラメータは異なる値としています。
それぞれ早く終わりすぎないよう0.1秒のディレイをループに挿入しています。

コンパイル結果

ではコンパイルしてみます。下位ライブラリはfileを指定します。
asyncChildprocessC1,2,3の結果は割愛しています。

Mind9

下図はMind9βです。

C:\developments\vscode\mind9>mind asyncChildprocessP3 file   

日本語プログラミング言語 Mind Version 8.11 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. C:\mind9-beta\mind9-beta\bin\mindex.exe --> asyncChildprocessP3.exe

Mind8

C:\developments\vscode\mind9>mind asyncChildprocessP3 file

日本語プログラミング言語 Mind Version 8.07 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. c:\pmind\bin\mindex.exe --> asyncChildprocessP3.exe

Mind7

C:\developments\vscode\mind9>mind asyncChildprocessP3 file
日本語プログラミング言語 Mind Version 7.5 for Windows
          Copyright(C) 1985-2004 Scripts Lab. Inc.
          Single user license.  Serial No:********
コンパイル中 - 終了
Coping.. C:\mind7\bin\mindexec.exe -> asyncChildprocessP3.exe

実行結果

つづいて実行してみます。
下記のような実行プログラムが生成されています。コンパイル結果はMind7です。

C:\developments\vscode\mind9>dir asyncChildprocess*.exe

 C:\developments\vscode\mind9 のディレクトリ
2025/08/16  07:43            57,344 asyncChildprocessC1.exe
2025/08/16  07:42            57,344 asyncChildprocessC2.exe
2025/08/16  07:42            57,344 asyncChildprocessC3.exe
2025/08/16  07:37            57,344 asyncChildprocessP3.exe
               4 個のファイル             229,376 バイト

Mind8の結果です。記述は割愛していますがMind7/9βも同じです。ただし、同じバージョンでも実行した結果はメッセージ出力の前後関係が若干変わる場合がありますので、異なるバージョンで実行した場合も同様です。

最初にchildprocessC1,2,3を単独起動し、続いてchildprocessP3を起動します。(childprocessP3によってchildprocessC1,2,3も起動されます。)

C:\developments\vscode\mind9>asyncChildprocessC1 
子プロセス1実行開始しました。
子プロセス1実行中です。
子プロセス1実行中です。
子プロセス1実行中です。
子プロセス1実行中です。
子プロセス1実行中です。
子プロセス1実行中です。
子プロセス1実行中です。
子プロセス1実行中です。
子プロセス1実行中です。
子プロセス1実行中です。
子プロセス1実行終了しました。

C:\developments\vscode\mind9>asyncChildprocessC2 
子プロセス2実行開始しました。
子プロセス2実行中です。
子プロセス2実行中です。
子プロセス2実行中です。
子プロセス2実行中です。
子プロセス2実行終了しました。

C:\developments\vscode\mind9>asyncChildprocessC3 
子プロセス3実行開始しました。
子プロセス3実行中です。
子プロセス3実行中です。
子プロセス3実行終了しました。

C:\developments\vscode\mind9>

C1は10回、C2が4回、C3が2回それぞれメッセージ出力を繰り返します。

C:\developments\vscode\mind9>asyncChildprocessP3
親プロセス実行開始しました。
子プロセス起動エラー0:No such file or directory
プロセスID1:348
プロセスID2:356
プロセスID3:368
親プロセス実行中です。
プロセスID0の子プロセスの終了パラメータ:
0
子プロセス1実行開始しました。
子プロセス2実行開始しました。
子プロセス2実行中です。
子プロセス1実行中です。
子プロセス3実行開始しました。
子プロセス3実行中です。
親プロセス実行中です。
子プロセス3実行中です。
子プロセス2実行中です。
子プロセス1実行中です。
親プロセス実行中です。
子プロセス1実行中です。
子プロセス3実行終了しました。
子プロセス2実行中です。
親プロセス実行中です。
プロセスID3の子プロセスの終了パラメータ:
65533
子プロセス2実行中です。
子プロセス1実行中です。
親プロセス実行中です。
子プロセス2実行終了しました。
子プロセス1実行中です。
親プロセス実行中です。
プロセスID2の子プロセスの終了パラメータ:
65534
子プロセス1実行中です。
親プロセス実行中です。
子プロセス1実行中です。
親プロセス実行中です。
子プロセス1実行中です。
親プロセス実行中です。
子プロセス1実行中です。
親プロセス実行中です。
子プロセス1実行中です。
親プロセス実行中です。
子プロセス1実行終了しました。
親プロセス実行中です。
プロセスID1の子プロセスの終了パラメータ:
65535
親プロセス実行終了しました。

C:\developments\vscode\mind9>

childprocessDを起動した箇所ではエラーが返ってきていることがわかります。
またDの終了検知は、終了で正常判定されています。
起動順はC1,C2,C3ですが、終了の検知順はC3,C2,C1となっていることがわかります。

参考情報

この小技「子プロセス終了?」を使った記述例の記事は未発見です。

おわりに

いかがでしたでしょうか?なにかの参考になれば幸いです。2025年は日本語プログラミング言語Mind生誕40周年です。

本記事シリーズのご紹介

本記事シリーズ「日本語プログラミング言語Mindの小技」は「日本語プログラミング言語Mind生誕40周年プロジェクト」の一環です。

興味を持たれた方は日本語プログラミング言語Mind公式サイトにアクセスすると、Mindコンパイラをダウンロードできます。

面白い!、楽しい、カンタン、難しいのも書ける!みんなでやってみよう:relaxed:

3
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?