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/include
。grep
かけてみると次のとおり。
$ 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_TYPE
はtypedef
ってこと?堂々巡りしている気分。もう一度整理すると、こういうことか。
_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()
が返すのは整数なんだ。