我觉得最好的办法就是,在linux上面开发,慢慢就会这些函数的使用了,不然光看,啥也记不住
13.1和13.2
ps -axj
-a 其他用户所有有的进程状态
-x 没有控制中断的进程状态
-j 与作业有关的信息
oot@ubun2004:/home/learnApue/apue.3e/threads# ps -axj
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
0 1 1 1 ? -1 Ss 0 0:03 /sbin/init splash
0 2 0 0 ? -1 S 0 0:00 [kthreadd]
2 3 0 0 ? -1 I< 0 0:00 [rcu_gp]
2 4 0 0 ? -1 I< 0 0:00 [rcu_par_gp]
2 6 0 0 ? -1 I< 0 0:00 [kworker/0:0H-events_highpri]
2 9 0 0 ? -1 I< 0 0:00 [mm_percpu_wq]
2 10 0 0 ? -1 S 0 0:00 [rcu_tasks_rude_]
2 11 0 0 ? -1 S 0 0:00 [rcu_tasks_trace]
2 12 0 0 ? -1 S 0 0:00 [ksoftirqd/0]
2 13 0 0 ? -1 I 0 0:02 [rcu_sched]
2 14 0 0 ? -1 S 0 0:00 [migration/0]
2 15 0 0 ? -1 S 0 0:00 [idle_inject/0]
2 16 0 0 ? -1 S 0 0:00 [cpuhp/0]
2 17 0 0 ? -1 S 0 0:00 [cpuhp/1]
2 18 0 0 ? -1 S 0 0:00 [idle_inject/1]
2 19 0 0 ? -1 S 0 0:00 [migration/1]
2 20 0 0 ? -1 S 0 0:00 [ksoftirqd/1]
2 22 0 0 ? -1 I< 0 0:00 [kworker/1:0H-events_highpri]
2 23 0 0 ? -1 S 0 0:00 [kdevtmpfs]
2 24 0 0 ? -1 I< 0 0:00 [netns]
18272 19377 19376 18161 pts/1 19376 S+ 0 0:00 grep --color=auto rpcbind
方括号的,都是内核程序,父进程为0的一般也是内核进程,init(ID =1)例外,是一个用户层次的进程
ktrhead(ID = 2),用来把脏页面写回磁盘,并回收程序
rpcbind,提供将程序号映射成网络端口号的服务,
用户层和内核层都有守护进程,而用户层守护进程的父进程是init进程
13.3 编程规则
编写守护进程的一些规则,比如umask,关闭不用的文件描述符,fork以后关闭父进程,打开/dev/null 以防止输入和输出到用户终端 等等,具体参考apue源码的lib/damonize.c
void
daemonize(const char *cmd)
{
int i, fd0, fd1, fd2;
pid_t pid;
struct rlimit rl;
struct sigaction sa;
/*
* Clear file creation mask.
*/
umask(0);
/*
* Get maximum number of file descriptors.
*/
if (getrlimit(RLIMIT_NOFILE, &rl) < 0)
err_quit("%s: can't get file limit", cmd);
/*
* Become a session leader to lose controlling TTY.
*/
if ((pid = fork()) < 0)
err_quit("%s: can't fork", cmd);
else if (pid != 0) /* parent */
exit(0);
setsid();
/*
* Ensure future opens won't allocate controlling TTYs.
*/
sa.sa_handler = SIG_IGN;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
if (sigaction(SIGHUP, &sa, NULL) < 0)
err_quit("%s: can't ignore SIGHUP", cmd);
if ((pid = fork()) < 0)
err_quit("%s: can't fork", cmd);
else if (pid != 0) /* parent */
exit(0);
13.4 出错记录
因为守护进程没有终端(不能打印输入,输出到终端),上图为3中产生日志消息的方法,比如
通过syslogd守护进程,用户进程调用syslog打印日志到日志记录中
13.5 单实例守护进程
通过记录锁lockfile,来保证只有一个守护进程的副本在执行,并且对线程ID进行阶段ftrunctrate
13.6 守护进程的惯例
如果守护进程使用锁文件,锁文件在/var/run中,文件名格式为name.pid,
如果守护进程支持配置,一般在/etc,文件名格式为name.conf,比如syslog的/etc/syslog.conf
守护进程,一般由初始化脚本启动,比如/etc/init.d或者/etc/rc0.d等
13.7 客户进程-服务器进程模型
守护进程一般用作服务器进程,就这一句
完结