浅谈守护进程

  守护进程:

     也叫精灵进程,运行在后台的进程,独立于控制终端并周期性执行某种个任务。脱离终端是为了避免进程在运行过程中信息不会被终端打断,在整各系统关闭时退出。

  原理:

     守护进程是脱离控制终端的,就会造成在shell终端里造成程序已运行结束的假象,之后的工作都在子进程中进行,用户在shell终端中可以执行其他命令。父进程先退出会造成子进程成为孤儿进程,当系统发现孤儿进程时,自动由1号进程(init)进程收养,变成init进程的子进程继续运行。

      init进程是内核启动的第一个用户级的进程,内核启动后,装入内存,运行,初始化所有设备驱动、数据结构,启动init完成进程内核部分。在linux中可使用命令 ps axj查看系统中进程

a:列出当前进程及其他用户进程;

x:有/无控制终端的进程;

j:列出作业相关信息;

当tpgid的值为-1,表示没有控制终端的守护进程。

   创建新的会话:

       #include<unistd.h>

       pid_t   setsid( )

  setsid的作用:1、使进程脱离原会话

                          2、让进城脱离进程组控制

                          3、进程脱离终端控制 

  在fork子进程是会拷贝父进程的会话信息、进程组、控制终端,当父进程退出时,这些拷贝仍然存在,setsid()函数能使它完全独立。

    过程:

   1、重新设定文件权限:fork()函数会继承父进程文件权限信息掩码,应把文件权限设为0;

        umask(0);

   2、fork()子进程,父进程退出。先fork子进程再调用setsid,使子进程不为进程组leader。

   3、setsid();

   4、更改根目录  chdir("/");

   5、关闭对应的文件表述附表:子进程会继承父进程中一些已打开的文件,但父进程退出后,文件不会被子进程,守护进程读写,会消耗内存资源,守护进程和终端失联后,不能从终端输入,输出,文件描述符表0、1、2应关闭。

    创建成功:

        有新会话,进程id是会话id;有新进程组,当前进程id为组id;与控制终端脱离。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值