なんでもノート

t0m00m0tのノート。

C言語のpid_tを調べる

目的

Linuxのしくみ」のサンプルコードでpid_tという型がよく現れる。用途はgetpid()の戻り値を代入したり、などなど。このpid_tが何なのか、調べる。

どのライブラリ?

getpid()のオンラインマニュアルを見るとunistd.hで定義しているようだ。

$ man 3 getpid
SYNOPSIS
#include <unistd.h>
pid_t getpid(void);

unistd.hの調査

C言語のincludeのパスは/usr/includegrepかけてみると次のとおり。

$ cat /usr/include/unistd.h | grep -n pid_t
259:# ifndef __pid_t_defined
260:typedef __pid_t pid_t;
261:#  define __pid_t_defined

typedefがわからない・・・

typedefとは

ググってみると次のとおり。

C言語においてtypedefを使用すると既にあるデータ型に新しい名前をつけることができます。

typedef 既存のデータ型 新しい名前;

つまり、pid_t__pid_tの別名ってことだ。では__pid_tってなに?

__pid_tの調査

__pid_tの文字列を含むファイルを検索したら発見。

$ grep -rnw /usr -e '__pid_t'
(中略)
/usr/include/bits/types.h:142:__STD_TYPE __PID_T_TYPE __pid_t; /* Type of process identifications.  */

次の謎は__STD_TYPE__PID_T_TYPEだ。

__STD_TYPEの調査

__STD_TYPEの文字列を含むファイルを検索したらあった。

$ grep -rnw /usr -e '__STD_TYPE'
(中略)
/usr/include/bits/types.h:115:# define __STD_TYPE      __extension__ typedef
/usr/include/bits/types.h:126:# define __STD_TYPE      typedef

今度は# defineがわからない・・・

#defineとは

ググってみると次のとおり。

defineはC言語でのプリプロッセッサへの指示のひとつです。プリプロッセッサとは、コンパイルの前に前処理を行うプログラムのことです。下記の構文で記述すると、コンパイル時に前処理として、文字列1を文字列2に変換します。このような変換をマクロ置換と呼びます。

#define 文字列1 文字列2

つまり、__STD_TYPEtypedefってこと?堂々巡りしている気分。もう一度整理すると、こういうことか。

_STD_TYPE __PID_T_TYPE __pid_t;
は
typedef __PID_T_TYPE __pid_t;
と同じ

__PID_T_TYPEの調査

__PID_T_TYPEの文字列を含むファイルを検索したらあった。

$ grep -rnw /usr -e '__PID_T_TYPE'
(中略)
/usr/include/bits/typesizes.h:53:#define __PID_T_TYPE      __S32_TYPE

お!前進した。要は__S32_TYPEってことだ。

__S32_TYPEの調査

__S32_TYPEの文字列を含むファイルを検索したらあった。

$ grep -rnw /usr -e '__S32_TYPE'
(中略)
/usr/include/bits/types.h:100:#define  __S32_TYPE      int

やった!!!つまりpid_tは単なるintだった。getpid()が返すのは整数なんだ。

参考