-
考虑6.8节中说明的utmp和wtmp文件,为什么logout记录是由init进程写的?对于网络登录的处理与此相同吗?
答:因为init是登录shell的父进程,当登录shell终止时它收到SIGCHLD信号量,所以init进程知道什么时候终端用户注销。网络登录没有包含init,在utmp和wtmp文件中的登录项和相应的注销项是由一个处理登录并检测注销的程序写的(本例中为talneted)。 -
编写一段程序调用fork并使子程序建立一个新的会话。验证子程序变成了进程组组长且不再有控制终端。
答:https://github.com/bumzy/apue.3e/blob/master/relation/exercise0902.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#include "apue.h" #include <errno.h> #include <unistd.h> 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() { char c; pid_t pid; pr_ids("parent"); if ((pid = fork()) < 0) { err_sys("fork error"); } else if (pid > 0) { sleep(5); } else { pr_ids("child"); setsid(); pr_ids("child"); if (read(STDIN_FILENO, &c, 1) != 1) { printf("read error %d on controlling TTY\n", errno); } } exit(0); } |