トップ «前の日記(2014-05-26) 最新 次の日記(2014-05-28)» 編集

ヨタの日々

2001|08|09|10|11|12|
2002|01|02|03|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|12|
2024|01|02|03|

2014-05-27 :-(

_ 午前

0530 起床

0700 食堂

0830 出勤 && 検討

_ 午後

1300 検討

_

1700 残業アワー

2145 退勤

2230 飯。ブリの照り焼き

_ [コードリーディング][NetBSD][/bin/domainname][domainname][getdomainname][setdomainname]NetBSD /bin/domainname を読む

ソース src/bin/domainname/domainname.c

マニュアル domainname - NetBSD Manual Pages

読む。

  if (*argv) {
    if (setdomainname(*argv, strlen(*argv)))
      err(1, "setdomainname");
  } else {
    if (getdomainname(domainname, sizeof(domainname)))
      err(1, "getdomainname");
    (void)printf("%s\n", domainname);
  }

とはいえこれも hostname と同じ。getdomainname または setdomainname を呼び出す。

マニュアル getdomainname - NetBSD Manual Pages

ソース src/lib/libc/gen/setdomainname.c

int
setdomainname(name, namelen)
  const char *name;
  size_t namelen;
{
  int mib[2];

  _DIAGASSERT(name != NULL);

  mib[0] = CTL_KERN;
  mib[1] = KERN_DOMAINNAME;
  if (sysctl(mib, 2, NULL, NULL, name, namelen) == -1)
    return (-1);
  return (0);
}

ソース src/lib/libc/gen/getdomainname.c

int
getdomainname(name, namelen)
  char *name;
  size_t namelen;
{
  int mib[2];
  size_t size;
  int olderrno;

  _DIAGASSERT(name != NULL);

  mib[0] = CTL_KERN;
  mib[1] = KERN_DOMAINNAME;
  size = namelen;
  olderrno = errno;
  if (sysctl(mib, 2, name, &size, NULL, 0) == -1) {
    if (errno == ENOMEM) {
      errno = olderrno;
      return (0);
    }
    return (-1);
  }

  return (0);
}

sysctl を呼び出す

CTL_KERN と KERN_DOMAINNAME はこれ

     kern.domainname (KERN_DOMAINNAME)
             Get or set the YP domain name.

_ [NetBSD][/bin/kill][kill][コードリーディング]NetBSD /bin/kill を読む

ソース src/bin/kill/kill.c

マニュアル kill - NetBSD Manual Pages

使用例

kill 12345
kill -9 12345
kill -HUP 12345
kill -SIGHUP 12345

よむ。

numsig にデフォルトのシグナル番号を設定。デフォルトでは SIGTERM

  numsig = SIGTERM;

↑のように呼び出した場合。つまり -l も -s もしない場合はここを通る。

  } else if (**argv == '-') {
    char *sn = *argv + 1;
   
    // kill -HUP 12345 などの場合
    if (isalpha((unsigned char)*sn)) {

      // -HUP や -SIGHUP を 9 へ変換して numsig へ格納
      if ((numsig = signame_to_signum(sn)) < 0)
        nosig(sn);

    // kill -9 12345 などの場合
    } else if (isdigit((unsigned char)*sn)) {

      // 数値へ変換して numsig  へ格納
      numsig = strtoimax(sn, &ep, 10);

   以下略

シグナル名からシグナル番号へ変換する処理を見る。

static int
signame_to_signum(char *sig)
{
  int n;

  // SIGHUP などが与えられた場合は HUP とする
  if (strncasecmp(sig, "sig", 3) == 0)
    sig += 3;

  // sys_signame を線形探索してシグナル名を検索
  // シグナル名が格納されているインデックスがそのままシグナル番号となる。
  for (n = 1; n < NSIG; n++) {
    if (!strcasecmp(sys_signame[n], sig))
      return (n);
  }
  return (-1);
}

strncasecmp は大文字小文字を区別しないで比較 strcasecmp - NetBSD Manual Pages

sys_signame は以下で定義されている。

lib/libc/compat/gen/compat_signame.c

const char *const sys_signame[] = {
  "Signal 0",  /* 0 */
  "HUP",    /* 1 SIGHUP */
  "INT",    /* 2 SIGINT */
  "QUIT",    /* 3 SIGQUIT */
  "ILL",    /* 4 SIGILL */
  "TRAP",    /* 5 SIGTRAP */
  "ABRT",    /* 6 SIGABRT */
  "EMT",    /* 7 SIGEMT */
  "FPE",    /* 8 SIGFPE */
  "KILL",    /* 9 SIGKILL */
  "BUS",    /* 10 SIGBUS */
  "SEGV",    /* 11 SIGSEGV */
  "SYS",    /* 12 SIGSYS */
  "PIPE",    /* 13 SIGPIPE */
  "ALRM",    /* 14 SIGALRM */
  "TERM",    /* 15 SIGTERM */
  "URG",    /* 16 SIGURG */
  "STOP",    /* 17 SIGSTOP */
  "TSTP",    /* 18 SIGTSTP */
  "CONT",    /* 19 SIGCONT */
  "CHLD",    /* 20 SIGCHLD */
  "TTIN",    /* 21 SIGTTIN */
  "TTOU",    /* 22 SIGTTOU */
  "IO",    /* 23 SIGIO */
  "XCPU",    /* 24 SIGXCPU */
  "XFSZ",    /* 25 SIGXFSZ */
  "VTALRM",  /* 26 SIGVTALRM */
  "PROF",    /* 27 SIGPROF */
  "WINCH",  /* 28 SIGWINCH */
  "INFO",    /* 29 SIGINFO */
  "USR1",    /* 30 SIGUSR1 */
  "USR2",    /* 31 SIGUSR2 */
};

続き。

プロセス番号を得る。文字列から数値へ変換

      pid = strtoimax(*argv, &ep, 10);

ここに来るまでで得たシグナル番号とプロセス番号を用いて kill(2) を呼ぶ。kill(2) - NetBSD Manual Pages

    if (kill((pid_t) pid, (int) numsig) == -1) {