守护程序简介



守护进程是一个长期的运行过程中,通常运行在系统启动和结束时,系统是封闭的。一般来说,后台程序在后台运行,因为它不控制终端不能与前台的用户交互。后台程序一般是作为一个服务程序,等待客户端程序与它交流。我们也叫守护程序在后台运行。



例如,我们的网络服务程序可以转化为守护进程为背景执行不占控制终端完成设置界面创建后,结合套接口设置界面的监控模式,这是一种常见的网络服务程序的模式。在UNIX网络服务程序,如Web服务器、FTP和Telnet,一般是由守护进程(daemon)实施。守护不占用终端并在后台运行。UNIX的守护进程一般在* D的形式命名,如httpd,telnetd,等等。



一旦程序的终端,出口成为一个问题。使用PS时发现进程的ID,然后杀ID。



守护进程的编程规则



编写守护程序以避免不必要的麻烦有一些基本规则。



1。首先,在程序运行之后,调用叉并撤回父进程。子进程获得一个新进程、ID,但继承父进程的进程组ID。



2、使用setsid函数创建自己的新一届领导人和新进程组的一个新会话,使这一过程没有控制终端(TTY)。



3、改变当前工作目录的根目录,以免影响加载的文件系统,或可改变某些特定的目录。



4,设置一个文件来创建掩码是0,避免了权限对创建文件的影响。



5。关闭打开的文件描述符是不需要的。因为守护程序在后台执行,不需要与终端交互stdin,stdout,,和stderr通常是封闭的,其他的是根据实际情况处理。另一个问题是,守护程序无法与终端可以不使用printf输出信息的方法。



另一个问题是,守护程序无法与终端不能使用printf输出方法的信息。我们可以使用syslog机制来实现信息的输出,方便了程序的调试。



这是一个守护进程的一个例子程序:(daemontest。C)



查看plaincopy到clipboardprint



1。#包括



2。#包括



三.#包括



4。#包括



5。#包括



6。#包括



7。#包括



8。国际daemon_init(void)



9。{ {



10。pid_t PID;



11。如果((PID =叉())< 0)



12。返回(- 1);



13。否则(PID)!= 0)



14。出口(0);



15。 *子继续



16。setsid(成为会议的领导人); / * * /



17。chdir(/); / * * /改变工作目录



18。umask(0)明确的文件模式创建掩码; / * * /



19。关闭(0); / * * /关闭标准输入



20。关闭(1); / * * /关闭标准输出



21。关闭(2); / * * /关闭stderr



22。返回(0);



23。}



二十四



25。无效sig_term(int该)



26。{ {



27。如果(该= SIGTERM)



28。被发送的信号由杀 / * * /(1)命令



29。{ {



30。syslog(log_info,程序终止。);



31。closelog();



32。出口(0);



33。}



34。}



三十五



36。主(空)



37。{ {



38。(如果)(daemon_init = 1)



39。{ {



40。printf(不能叉selfn );



41。出口(0);



42。}



43。OPENLOG(daemontest



44。syslog(log_info,程序开始。);



45。(SIGTERM信号,sig_term); / *安排捕捉信号。



46。(1)



47。{ {



48。睡眠(1)把主程序放在这里;



49。}



50。返回(0);



51。}



下面的命令来编译程序:GCC的墙啊daemontest daemontest。C编译后被命名为daemontest,完整的可执行程序和/ daemontest执行测试程序的运行。



的PS AXJ命令的使用可以在系统中显示运行的守护进程信息,包括进程ID,会话ID、控制终端等的显示部分:



PPID PID PGID SID TTY tpgid STAT UID的命令



1177651776517765-1 SS 0 / daemontest 0:00。



你可以看到的daemontest程序的进程数为17765。



让我们看一看信息文件中的信息。



2月3日17:09:30 localhost daemontest { 17765 }:程序开始。



它显示了我们想要在程序中输出的信息。



使用杀死17765命令来杀死该进程,并且将有以下信息在:



2月3日17:12:26 localhost daemontest { 17765 }:程序终止。



然后使用PS AXJ命令来检查系统中的daemontest过程已经。