Linuxシステムコールの勉強(その2)

Linuxシステムコール

Linuxシステムコール

前回はこちら


前回と被る部分もありますが、とりあえずfork()についてまとめます。

1. fork()とexec()を組み合わせる事で新しいプロセスを生成出来る

2. fork()の返却値は以下のとおり

 0 - 自身は子プロセス
 0以上 - 自身は親プロセスで返却値は子プロセスのpid
 -1 - プロセスの複製失敗

 ただし返却値の型はintではなくpid_t型.
 # pid_tはtypes.hで定義されていて実際はint(typedef int pid_t)

3. pid_t wait(itn *status)で得られるstatusはちょっと特殊

子プロセスの終了理由 statusの内容
正常終了 上位8ビット == 終了ステータス
下位8ビット == 0
シグナルで終了 上位8ビット == 0
下位8ビット == 終了原因のシグナル番号

4. 3.を求めるためにいちいちビット演算するのは面倒なのでマクロが準備されている

子プロセス
終了理由
使用する
マクロ
説明
正常終了 WIFEXITED 子プロセスが正常終了したかどうか
(TRUE-正常終了 , FALSE-異常終了)
WEXITSTATUS 子プロセス終了ステータスの取得
シグナルで終了 WIFSIGNALED 子プロセスがシグナルで終了したかどうか
(TRUE-シグナルで終了 , FALSE-通常終了)
WTERMSIG 受信シグナル番号の取得


とりあえずexec()系のシステムコールがたくさんあって覚え切れなかったけど、ひとまずプロセス生成の部分についてはこれで終わり。まとめとしてfork()とexec()を使って新しいプロセスを生成するサンプルを載せます。

#include <stdio.h>

int main()
{
    pid_t pid    ;
    int   iStatus;

    // 自プロセスIDを表示 //
    printf("My Process ID = %d\n",getpid());

    if ((pid = fork()) == -1) // fork()失敗 //
    {
        perror("fork()");
        return 1;
    }
    else if (pid > 0 ) // 親プロセスの処理 //
    {
        printf("I am parent process...(id = %d)\n", getpid());
        wait(&iStatus);

        if (iStatus & 0x00ff) // 正常終了かどうか //
        {
            printf("child process has finished(status=%d)\n",(iStatus >> 4) & 0x00ff);
        }
        else
        {
            printf("child process has received signal(%d)\n", iStatus  & 0x00ff);
        }

    }
    else  // 子プロセスの処理 //
    {
        printf("I am child process...(id = %d)\n", getpid());
        printf("plead enter key...");
        getchar();

        if (execlp("ls", "ls", NULL) == -1)
        {
            perror("execlp()");
            return 2;
        }
        // 子プロセスの正常終了 //
        return 0;
    }

    // 親プロセスの正常終了 //
    return 0;
}


次へ進む