orphan process - ggubuk97/apue GitHub Wiki
#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๊ฐ ์ข ๋ฃ ๋๊ธฐ ๊น์ง ๊ธฐ๋ค๋ ค๋ ๋์ผํ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ๋ค.
#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)