2
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の小技 「子プロセス起動」~非同期実行と終了検知~

Last updated at Posted at 2025-08-09

はじめに

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

対象読者

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

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

この小技に関連するMind言語仕様の記述はMind8プログラミングマニュアルに記載がありません。(あったらごめんなさい。)

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

F6. プログラム実行関係
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

■子プロセス起動   (Ver.7新規)
    --------------------------------
    <起動文字列>を 子プロセス起動 → プロセスID
    --------------------------------
 子プロセスを起動し、自身は並行して処理を続行します。
 エラーリターンが有ります。かならず「エラー?」で検査してください。
 内部的には、fork() と execv() の組み合わせで実現されています。

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

対応バージョン

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

小技の解説

Mindのいくつかある外部プログラムの起動処理の一つである「子プロセス起動」について説明します。

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

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

■子プロセス終了を待つ (Ver.7新規)
   ---------------------------------
    <プロセスID> 子プロセス終了を待つとは → ・
   ---------------------------------
 先の「子プロセスを起動」または「fork直後の処理を指定し子プロセス起動」にて起動した子プロセスの終了を待つ機能です。リターンした時は子プロセスは終わっています。
 エラーリターンが有ります。かならず「エラー?」で検査してください。

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

Mindプログラムソース

親側

asynChildprocessP.src
メインとは  (・ → ・)
        プロセスID0は 変数
        プロセスID1は 変数
        プロセスID2は 変数
        プロセスID3は 変数
    「親プロセス実行開始しました。」を 一行表示し

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


	プロセスID1で 子プロセス終了を待ち
	エラー?
		ならば 「子プロセス終了待ちエラー:」を 表示し エラー表示し 改行し
        さもなければ
    	    「プロセスID1の子プロセスの終了パラメータ:」を 表示し 改行し 
            子プロセスの終了パラメータを 数値表示し 改行し    
		つぎに
    
    プロセスID2で 子プロセス終了を待ち
	エラー?
		ならば 「子プロセス終了待ちエラー:」を 表示し エラー表示し 改行し
        さもなければ
            「プロセスID2の子プロセスの終了パラメータ:」を 表示し 改行し    
            子プロセスの終了パラメータを 数値表示し 改行し
        つぎに
	
    プロセスID3で 子プロセス終了を待ち
	エラー?
		ならば 「子プロセス終了待ちエラー:」を 表示し エラー表示し 改行し
        さもなければ
            「プロセスID3の子プロセスの終了パラメータ:」を 表示し 改行し    
            子プロセスの終了パラメータを 数値表示し 改行し
        つぎに
	
    「親プロセス実行終了しました。」を 一行表示すること。

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

子側

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

それぞれ反復回数と終了パラメータは異なる値としています。

コンパイル結果

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

Mind9

下図はMind9βです。

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

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

Mind8

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

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

Mind7

C:\developments\vscode\mind9>mind asyncChildprocessP 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 -> asyncChildprocessP.exe

実行結果

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

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

 C:\developments\vscode\mind9 のディレクトリ
2025/08/09  09:31            57,344 asyncChildprocessC1.exe
2025/08/09  09:32            57,344 asyncChildprocessC2.exe
2025/08/09  09:32            57,344 asyncChildprocessC3.exe
2025/08/09  09:31            57,344 asyncChildprocessP.exe
               4 個のファイル             229,376 バイト

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

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

C:\developments\vscode\mind9>asyncChildprocessC1 
子プロセス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実行中です。
子プロセス3実行中です。
子プロセス3実行中です。
子プロセス3実行終了しました。

C:\developments\vscode\mind9>
C:\developments\vscode\mind9>asyncChildprocessP
親プロセス実行開始しました。
子プロセス起動エラー0:No such file or directory
プロセスID1:252
プロセスID2:340
プロセスID3:372
子プロセス終了待ちエラー0:Can't execute child process
子プロセス1実行開始しました。
子プロセス1実行中です。
子プロセス1実行中です。
子プロセス1実行中です。
子プロセス1実行終了しました。
子プロセス2実行開始しました。プロセスID1の子プロセスの終了パラメータ:
65535

子プロセス2実行中です。
子プロセス2実行中です。
子プロセス2実行中です。
子プロセス2実行中です。
子プロセス2実行終了しました。
子プロセス3実行開始しました。
子プロセス3実行中です。
子プロセス3実行中です。
子プロセス3実行中です。
子プロセス3実行中です。
子プロセス3実行中です。
子プロセス3実行終了しました。
プロセスID2の子プロセスの終了パラメータ:
65534
プロセスID3の子プロセスの終了パラメータ:
65533
親プロセス実行終了しました。

C:\developments\vscode\mind9>

childprocessDを起動した箇所ではエラーが返ってきていることがわかります。
概ね実行順で終了して、実行順の終了検知は正常動作していることがわかります。

実行結果パターン2

ここでディレイを使って実行時間を意図的に変動させてもよいのですが、とりあえずC1の実行回数を多めにして、他を少な目にしてC1の実行完了を待たずにC2,C3が開始してしまう状況を起こしてみます。

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実行終了しました。

ぞれぞれの子プロセス用プログラムの反復回数が変化した状態です。C1は10回、C2が4回、C3が2回です。

C:\developments\vscode\mind9>asyncChildprocessP          
親プロセス実行開始しました。
子プロセス起動エラー0:No such file or directory
プロセスID1:356
プロセスID2:348
プロセスID3:388
子プロセス終了待ちエラー0:Can't execute child process

子プロセス1実行開始しました。
子プロセス1実行中です。
子プロセス1実行中です。
子プロセス1実行中です。
子プロセス1実行中です。
子プロセス1実行中です。
子プロセス2実行開始しました。
子プロセス1実行中です。
子プロセス1実行中です。
子プロセス1実行中です。
子プロセス1実行中です。子プロセス2実行中です。子プロセス3実行開始しました。
子プロセス3実行中です。

子プロセス2実行中です。
子プロセス2実行中です。子プロセス3実行中です。
子プロセス3実行終了しました。

子プロセス2実行中です。
子プロセス2実行終了しました。

子プロセス1実行中です。
子プロセス1実行終了しました。
プロセスID1の子プロセスの終了パラメータ:
65535
プロセスID2の子プロセスの終了パラメータ:
65534
プロセスID3の子プロセスの終了パラメータ:
65533
親プロセス実行終了しました。

終了の検知は実行順に行っていますが、エコーの状態より実際に終了した順序は、C3、C2、C1の順であることがわかります。

C2の実行開始のメッセージの出力と改行出力のタイミングがC1,C3の実行中メッセージ出力で前後したためこのあたりの改行出力がくずれています。

実行結果パターン3

これまでのサンプルでは、子プロセスを起動した後親プロセスが処理を続行しているということが少々わかりづらいと思われましたので、最後の子プロセス起動と最初の終了検知の間に、「親プロセス実行中です。」のエコー出力を追加してみました。

親側

asynChildprocessP2.src
メインとは  (・ → ・)
        プロセスID0は 変数
        プロセスID1は 変数
        プロセスID2は 変数
        プロセスID3は 変数
    「親プロセス実行開始しました。」を 一行表示し

   ~略~
    
    "asyncChildprocessC3"を 子プロセス起動し プロセスID3に 入れ
    エラー?
    ~略~

    4で 回数指定し
    「親プロセス実行中です。」を 一行表示し
    繰り返す

	プロセスID0で 子プロセス終了を待ち
	エラー?

    ~略~
C:\developments\vscode\mind9>asyncChildprocessP2
親プロセス実行開始しました。
子プロセス起動エラー0:No such file or directory
プロセスID1:340
プロセスID2:368
プロセスID3:348
親プロセス実行中です。
親プロセス実行中です。
親プロセス実行中です。
親プロセス実行中です。
子プロセス終了待ちエラー0:Can't execute child process

子プロセス1実行開始しました。子プロセス2実行開始しました。

子プロセス1実行中です。
子プロセス1実行中です。
子プロセス1実行中です。
子プロセス1実行中です。
子プロセス1実行中です。
子プロセス1実行中です。
子プロセス1実行中です。
子プロセス1実行中です。子プロセス2実行中です。
子プロセス2実行中です。
子プロセス2実行中です。
子プロセス2実行中です。
子プロセス2実行終了しました。

子プロセス1実行中です。
子プロセス1実行中です。
子プロセス1実行終了しました。
プロセスID1の子プロセスの終了パラメータ:
65535
プロセスID2の子プロセスの終了パラメータ:
65534
子プロセス3実行開始しました。
子プロセス3実行中です。
子プロセス3実行中です。
子プロセス3実行終了しました。
プロセスID3の子プロセスの終了パラメータ:
65533
親プロセス実行終了しました。

C:\developments\vscode\mind9>  

参考情報

この小技「子プロセス起動」を使った記述例の記事は完全に同一単語のは未発見ですが、近い単語の「子をリダイレクトして子プロセス起動」と「子プロセス終了を待つ」を使った例が、開発者ご自身@killyさんによる記事にあります。

おわりに

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

本記事シリーズのご紹介

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

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

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

2
1
4

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
2
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?