-
Notifications
You must be signed in to change notification settings - Fork 2
orphan process
flowergom edited this page Oct 27, 2015
·
1 revision
#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)