linux 守护进程详解及建立守护进程

所属分类: 脚本专栏 / linux shell 阅读数: 950
收藏 0 赞 0 分享

linux 守护进程详解及建立守护进程

守护进程是一种后台运行并且独立于所有终端控制之外的进程。

  守护进程的启动

  要启动一个守护进程,可以采取一下几种方式:

  • 在系统期间通过系统的初始化脚本启动守护进程。这些脚本通常在目录etc/rc.d下,通过它们所启动的守护进程具有超级用户的权限。系统的一些基本服务通常都是通过这种方式启动的。
  • 很多网络服务程序都是由inetd守护程序启动的。它监听各种网络请求,如telnet、ftp等,在请求到达时启动相应的服务器程序(telnet server,ftp server等)。
  • 由cron定时启动的处理程序。这些程序在运行时实际上也是一种守护进程。
  • 由at启动的处理程序。
  • 守护程序也可以从终端启动,通常这种方式只用于守护进程的测试,或者是重启因某种原因而停止的进程。
  • 在终端上用nohup启动的进程。用这种方法可以把所有的程序都变成守护进程。

  守护进程的建立

  先来看一个守护进程建立的例子:    

#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
#include <syslog.h>

#define MAXFD 64

void daemon_init(const char* pname, int facility){
  int i;
  pit_t pid;
  
  /*fork(),终止父进程*/
  if(pid=fork()){
    exit(0);
  }
  /*第一子进程*/
  setsid();
  signal(SIGHUP,SIG_IGN);
  /*fork()终止第一子进程*/
  if(pid=fork())
    exit(0);
  /*第二子进程*/
  daemon_proc = 1;
  /*将工作目录设定位“/”*/
  chdir("/");
  /*清除文件掩码*/
  umask(0);
  for(i = 0; i<MAXFD; i++){
    close(i);
  }
  /*打开log*/
  openlog(pname, LOG_PID, facility);
}

  从上面的程序可以看出,建立一个守护进程需要以下操作:

  1. fork。首先需要fork一个子进程并将父进程关闭。如果进程是作为一个shell命令在命令行前台启动的,当父进程终止时,shell就认为该命令已经结束。这样子进程就自动成为了后台进程。而且,子进程从父进程那里继承了组标识符同时又拥有了自己的进程标识符,这样保证了子进程不会是一个进程组的首进程。这一点是下一步setsid所必需的。
  2. setsid。setsid()调用创建了一个新的进程组,调用进程成为该进程组的首进程。这样,就使该进程脱离原来的终端,成为了独立终端外的进程。
  3. 忽略SIGHUP信号,重新fork。这样使进程不再是进程组的首进程,可以防止在某些情况下进程意外的打开终端而重新与终端发生联系。
  4. 改变工作目录,清楚文件掩码。改变工作目录主要是为了切断进程与原有文件系统的联系。并且保证无论从什么地方启动进程都能正常工作。清除文件掩码是为了消除进程自身掩码对其创建文件的影响。
  5. 关闭全部已打开的文件句柄。这是为了防止子进程继承在父进程中打开的文件而使这些文件始终保持打开从而产生某些冲突。
  6. 打开log系统。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

更多精彩内容其他人还在看

linux创建用户useradd命令代码示例

本文通过代码示例给大家介绍了adduser与useradd命令二者的关系 以及使用useradd命令添加用户的方法,需要的朋友参考下吧
收藏 0 赞 0 分享

Linux 中LVS NAT 配置步骤的详解

这篇文章主要介绍了Linux 中LVS NAT 配置步骤的详解的相关资料,这里列出详细的实现步骤,需要的朋友可以参考下
收藏 0 赞 0 分享

Linux中的内核链表实例详解

这篇文章主要介绍了Linux中的内核链表实例详解的相关资料,链表中一般都要进行初始化、插入、删除、显示、释放链表,寻找节点这几个操作,需要的朋友可以参考下
收藏 0 赞 0 分享

Shell中特殊字符的用法总结大全

这篇文章主要给大家总结了关于Shell中特殊字符的相关资料,文中包括分好、&、#、!、$、大于号、单双引号等等一系列特殊字符的用法,通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
收藏 0 赞 0 分享

Shell脚步攻略之管道重定向基础

管道是为了解决进程间通信问题而存在,它可以让两个进程之间的数据进行传递,将一个进程的输出数据传递给另一个进程作为其输入数据
收藏 0 赞 0 分享

Linux shell数组循环的实例详解

这篇文章主要介绍了Linux shell数组循环的实例详解的相关资料,这里举例说明如何实现shell数组循环,需要的朋友可以参考下
收藏 0 赞 0 分享

linux shell内置判断语句

内置判断,成功的时候返回0,不成功返回非零。接下来通过本文重点给大家介绍linux shell内置判断语句,感兴趣的的朋友一起看看吧
收藏 0 赞 0 分享

Linux文件的归档和压缩命令

文件归档命令tar,文件归档有好多好处,方便使用易于管理,接下来通过本文给大家分享linux文件的归档和压缩命令,感兴趣的朋友一起看看吧
收藏 0 赞 0 分享

Linux Shell中curl和wget使用代理IP的方法教程

这篇文章主要给大家介绍了关于在Linux Shell中curl和wget使用代理IP的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。
收藏 0 赞 0 分享

Linux 日常常用指令及应用小结

最近在学习一些基本的Linux指令,在这里总结一下,在搭环境中常用的一些指令,熟悉这些指令就基本能够使用CentOS进行日常操作了
收藏 0 赞 0 分享
查看更多