- 作者: 塚越一雄
- 出版社/メーカー: 技術評論社
- 発売日: 2000/06
- メディア: 単行本
- 購入: 3人 クリック: 56回
- この商品を含むブログ (35件) を見る
前回はこちら
前回と被る部分もありますが、とりあえずfork()についてまとめます。
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; }