getpid on libc

へんなことに気がついた。

#include <unistd.h>

static const int REPEAT = 100;

int
main()
{
  int i;

  for (i = 0; i < REPEAT; i++)
    {
      getpid();
      getpgid();
    }

  return 0;
}
% gcc -O0 -o test test.c
% strace -c -egetpid,getpgid ./test
Process 9039 detached
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00    0.001302          13       100       100 getpgid
  0.00    0.000000           0         1           getpid
------ ----------- ----------- --------- --------- ----------------
100.00    0.001302                   101       100 total

getpgid は 100 回呼ばれているけど、getpid は 1 回しか呼ばれてない。
getpid の結果 libc 内部で cache してある感じかなぁ。まぁ、変化することはないはずだからな。

追記

getppid に直して再測定。

#include <unistd.h>

static const int REPEAT = 100;

int
main()
{
  int i;

  for (i = 0; i < REPEAT; i++)
    {
      getpid();
      getppid();
    }

  return 0;
}
% gcc -O0 -Wall -Wextra -o test
% strace -c -egetpid,getppid ./test
Process 7039 detached
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00    0.000356           4       100           getppid
  0.00    0.000000           0         1           getpid
------ ----------- ----------- --------- --------- ----------------
100.00    0.000356                   101           total