APUE 第十三章 守护进程(看完)

我觉得最好的办法就是,在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 客户进程-服务器进程模型

守护进程一般用作服务器进程,就这一句

完结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值