orphan process - ggubuk97/apue GitHub Wiki

example 9.12
#include "apue.h"
#include <errno.h>
static void
sig_hup(int signo)
{
  printf("SIGHUP received, pid = %ld\n", (long)getpid());
}
static void
pr_ids(char *name)
{
  printf("%s: pid = %ld, ppid = %ld, pgrp = %ld, tpgrp = %ld\n",
  name, (long)getpid(), (long)getppid(), (long)getpgrp(),
  (long)tcgetpgrp(STDIN_FILENO));
  fflush(stdout);
}

int
main(void)
{
  char c;
  pid_t pid;
  pr_ids("parent");
  if ((pid = fork()) < 0) {
    err_sys("fork error");
  } else if (pid > 0) { /* parent */
    printf("parent[%d] : call sleep(5)\n",getpid());
    sleep(5); /* sleep to let child stop itself */
  } else { /* child */
    pr_ids("child");
    printf("child[%d] : call signal\n",getpid());
    signal(SIGHUP, sig_hup); /* establish signal handler */
    printf("child[%d] : call kill\n",getpid());
    kill(getpid(), SIGTSTP); /* stop ourself */
    pr_ids("child"); /* prints only if weโ€™re continued */
    if (read(STDIN_FILENO, &c, 1) != 1)
      printf("read error %d on controlling TTY\n", errno);
  }
  printf("parent[%d] : call exit(0)\n",getpid());
  exit(0);
}
์‹คํ–‰๊ฒฐ๊ณผ
$ ./9.12.out 
parent: pid = 4595, ppid = 327, pgrp = 4595, tpgrp = 4595
parent[4595] : call sleep(5)
child: pid = 4596, ppid = 4595, pgrp = 4595, tpgrp = 4595
child[4596] : call signal
child[4596] : call kill
parent[4595] : call exit(0)
SIGHUP received, pid = 4596
child: pid = 4596, ppid = 1, pgrp = 4595, tpgrp = 4595
read error 5 on controlling TTY
parent[4596] : call exit(0) 

signal ๊ณผ kill ํ•จ์ˆ˜๋Š” parent๊ฐ€ ์ข…๋ฃŒ ๋˜๋Š” ๋™์•ˆ child ์ค‘๋‹จ ์‹œํ‚ค๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜๋กœ์จ ์œ„์˜ ํ•จ์ˆ˜ ๋Œ€์‹ ์— sleep์œผ๋กœ parent๊ฐ€ ์ข…๋ฃŒ ๋˜๊ธฐ ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค๋„ ๋™์ผํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

sleep ํ•จ์ˆ˜ ์ด์šฉ
 #include "apue.h"
#include <errno.h>
static void
sig_hup(int signo)
{
  printf("SIGHUP received, pid = %ld\n", (long)getpid());
}
static void
pr_ids(char *name)
{
  printf("%s: pid = %ld, ppid = %ld, pgrp = %ld, tpgrp = %ld\n",
  name, (long)getpid(), (long)getppid(), (long)getpgrp(),
  (long)tcgetpgrp(STDIN_FILENO));
  fflush(stdout);
}

int
main(void)
{
  char c;
  pid_t pid;
  pr_ids("parent");
  if ((pid = fork()) < 0) {
    err_sys("fork error");
  } else if (pid > 0) { /* parent */
    printf("parent[%d] : call sleep(5)\n",getpid());
    sleep(2); /* sleep to let child stop itself */
  } else { /* child */
    pr_ids("child");
    //printf("child[%d] : call signal\n",getpid());
    printf("child[%d] : call sleep(5)\n",getpid());
    //signal(SIGHUP, sig_hup); /* establish signal handler */
    //printf("child[%d] : call kill\n",getpid());
    //kill(getpid(), SIGTSTP); /* stop ourself */
    sleep(5);
    pr_ids("child"); /* prints only if weโ€™re continued */
    if (read(STDIN_FILENO, &c, 1) != 1)
      printf("read error %d on controlling TTY\n", errno);
  }
  printf("parent[%d] : call exit(0)\n",getpid());
  exit(0);
}
์‹คํ—˜ ๊ฒฐ๊ณผ
$ ./9.12.out 
parent: pid = 4613, ppid = 327, pgrp = 4613, tpgrp = 4613
parent[4613] : call sleep(5)
child: pid = 4614, ppid = 4613, pgrp = 4613, tpgrp = 4613
child[4614] : call sleep(5)
parent[4613] : call exit(0)
$ child: pid = 4614, ppid = 1, pgrp = 4613, tpgrp = 327 // ์œ„์˜ ์˜ˆ์ œ ๊ฒฐ๊ณผ์™€ ๋™์ผํ•˜๊ฒŒ child์˜ ppid๊ฐ€ 1์ด ๋˜์—ˆ๋‹ค.
read error 5 on controlling TTY
parent[4614] : call exit(0) 
โš ๏ธ **GitHub.com Fallback** โš ๏ธ