テクノロジーの雑学・豆知識

PC・スマホ、プログラミング、電子機器、電化製品についての雑学・うんちく・豆知識・トリビアを集めたサイトです。気になった記事や文章を個人のメモとして投稿しています

【C言語文例】プロセスIDを取得するgetpid()の使い方

ヘッダ:unistd.h

書式:pid_t getpid(void)

引数:なし

戻り値:現在実行しているプロセスのプロセスID

解説:現在実行しているプロセスのプロセスIDを返します。

サンプルプログラムはfork()を使用して、子プロセスを作成するマルチプロセスのプログラムです。

 

<サンプルプログラム>

/****************************************************************************/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>

#define PROCESS_NUM 3
#define ROOP_NUM 3

// 子プロセスの処理
void child()
{
pid_t c_pid; // 子プロセスID
pid_t p_pid; // 親プロセスID
int num;

c_pid = getpid(); // 現プロセスID取得
p_pid = getppid(); // 親プロセスID取得

fprintf(stdout,"[PID:%d]子プロセス開始(親プロセスIDは%d)\n", c_pid, p_pid);

for(num = 1; num <= ROOP_NUM; num++)
{
sleep(1);
fprintf(stdout,"[PID:%d]%d回目のループ\n", c_pid, num);
}
fprintf(stdout,"[PID:%d]子プロセス終了\n",c_pid);
return;
}

int main()
{
pid_t c_pid; // 子プロセスID
pid_t p_pid; // 親プロセスID
int i;
int status;

// 親プロセスIDを取得
p_pid = getpid();
fprintf(stdout, "[PID:%d]親プロセス開始\n", p_pid);

// 子プロセス生成
for(i = 0; i < PROCESS_NUM; i++)
{
switch(c_pid = fork()) // 子プロセス生成
{
case 0: // 子プロセス
child();
exit(EXIT_SUCCESS); // 子プロセス終了
case -1:
fprintf(stderr, "子プロセス作成エラー\n");
break;
default: // 親プロセス
fprintf(stdout, "[PID:%d]子プロセス(pid=%d)作成\n", p_pid, c_pid);
sleep(2);
break;
}
}

// 子プロセスの終了を待つ
for(i = 0; i < PROCESS_NUM; i++)
{
c_pid = wait(&status); // 子プロセスの状態変化を待つ
fprintf(stdout, "[PID:%d]子プロセス(pid=%d)終了\n", p_pid, c_pid);
}

fprintf(stdout, "[PID:%d]親プロセス終了\n", p_pid);
return 0;
}
/****************************************************************************/

<実行フロー>

 


<実行結果>