📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

ページの作成:「== 概要 == 異なるプロセスを生成して外部コマンドプログラムを実行する場合、<code>system</code>関数 (シェルの機能を使用してコマンドを実行) および<code>exec</code>関数ファミリーを使用する。<br> 他にも、<code>popen</code>関数 (パイプで通信可能) 等がある。<br> <br> ただし、これらの関数を実行する時、制御はそのプログラムへ移行するため自身のプログ…」
 
86行目: 86行目:
       // エラーが発生した場合
       // エラーが発生した場合
       perror(strerror(errno));
       perror(strerror(errno));
    }
    return 0;
}
</syntaxhighlight>
<br>
==== fork関数の使用例 ====
exec関数ファミリーは制御が戻らないため、メインプロセスの処理を続行させる場合、fork関数により子プロセスを生成して、exec関数ファミリーを実行する。<br>
<syntaxhighlight lang="c">
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{
    pid_t pid = fork();
    if (pid < 0) {
        perror("fork");
        exit(-1);
    }
    else if (pid == 0) {
        // 子プロセスで外部コマンドを実行する
        execlp("/usr/bin/echo", "echo", "abc", "def", NULL);
        perror("echo");
        exit(-1);
    }
    // 親プロセス
    int status = 0;
    pid_t p = waitpid(pid, &status, 0);  // 子プロセスの終了を待つ
    if (p < 0) {
        perror("waitpid");
        exit(-1);
    }
    if (WIFEXITED(status)) {
        // 子プロセスが正常終了した場合
        printf("child exit-code=%d\n", WEXITSTATUS(status));
    }
    else {
        printf("child status=%04x\n", status);
     }
     }
   
   
95行目: 137行目:


__FORCETOC__
__FORCETOC__
[[カテゴリ:C]][[カテゴリ:C++]]
[[カテゴリ:C]]