欢迎来到天天文库
浏览记录
ID:10728404
大小:175.00 KB
页数:18页
时间:2018-07-07
《10.守护进程和超级服务器inetd》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、十守护进程和超级服务器inetd第10章守护进程和超级服务器inetd10.1守护进程的原理10.1.1安全的守护进程的步骤只要系统没有关机或者崩溃,守护进程将在系统中不间断的运行。所以必须使守护进程和其他进程运行的环境隔离开,避免由于其他进程的动作,影响守护进程的工作。问题的关键就是如何将守护进程的运行环境同其他进程隔离。1.第一次fork我们考虑在shell提示符下启动一个守护进程。这个进程通常将成为当前shell所在会话进程的领头进程,也就是拥有控制终端的进程(我们在文件系统和进程系统中说明的)。Linux中的每个进程都继承了一个到终端的连接,这个终端被指定为控
2、制终端,启动进程的用户可以使用这个控制终端对进程进行控制,比如在具有作业控制功能的shell中,用户ctrl+c将发送SIGINT给进程组的中的每个进程。所以来自终端的各种信号将可能影响这个进程的工作。我们希望将进程和它的控制终端分离开,这样来自控制终端的信号就不会影响守护进程。调用setsid可以使进程成为新的会话过程的领头进程,setsid的另一个结果就是将控制终端留给原先的会话过程,这样调用setsid的进程实际上就与原来的控制终端分离了。进程能够调用setsid的条件是,这个进程必须不是一个进程组的领导者,但是当守护进程最初在shell中运行时,它将成为它所在
3、进程组的领导者。为了能够成功的调用setsid,我们将进行第一次fork,这次fork后,父进程退出,而子进程将继续运行。代码如下:ret=fork();if(ret<0){fprintf(stderr,"errorinfirstfork.");exit(1);}elseif(ret!=0)exit(0);此时子进程肯定不再进程组的领导者,所以该进程可以安全的调用setsid。2.调用setsid接着我们调用setsid,将进程同旧会话过程中分离出来,使它自身单独的在一个新的会话过程中。但是由于进程是这个新的会话过程的领头进程,所以它如果打开一个终端,则这个终端将
4、成为它的控制终端,则进程又将可能收到新的控制终端的影响。为了避免这一点,我们将再次进行fork,使进程不再是这个新的会话过程的领头进程,17十守护进程和超级服务器inetd这样即使进程打开一个终端,这个终端也不能成为这个会话过程的控制终端。进程将不再会同一个控制终端相连。但是由于此时进程是会话进程的领头进程,如果我们使用上面类似的代码,使父进程退出,而子进程继续运行,则父进程退出时,将会产生SIGHUP信号,这个信号将发送给这个会话进程中的所有进程。所以我们首先要忽略信号SIGHUP,然后再fork。下图显示了进程此时的地位和状态。3.忽略信号SIGHUP,第2次fo
5、rk在第2次fork后,进程已经脱离了控制终端,但是,它与退出的父进程属于同一个进程组,所以发送个原来进程组的信号仍然可能发送给这个进程,所以进程将调用setpgrp(),使自身脱离原来的进程组,而成为一个新的进程组的领导者。到此为止,进程已经完全调整好自身的“位置”。我们在图10.2中完整的说明了这个过程。但是与进程相关的还有一些环境问题。进程还要继续完成一些操作。4.关闭所有的文件描述符在父进程创建子进程时,它已经打开的文件或套接字描述符的副本将在子进程中继承。因此此时进程所继承的描述符集合与它是如何启动有关。在Linux中,文件和套接字对象都使用引用技术的机制,
6、保留描述符打开实际上是浪费资源,并且可能会干扰别的进程工作,比如进程A试图删除文件F,但是文件F在我们的服务进程中保留打开状态,则文件将没有实际的删除,而是在服务进程退出后,文件F才被从磁盘中删除。所以服务进程必须关闭它所继承的文件描述,从而避免不必要的消耗资源。max_fd=sysconf(_SC_OPEN_MAX);for(i=0;i7、依次关闭,对于已经关闭的文件描述符,close将不产生任何影响。5.消除umask的影响每一个运行的进程都有一个umask同它向关联,它指定进程创建文件的保护掩码。文件掩码是系统提供的一种安全的机制,可以用来限制进程创建文件的权限。守护进程可能会受到文件掩码的影响。比如,进程希望建立一个文件,文件的模式为0777,但是由于进程的文件掩码为0277,则文件实际的属性为0500,而后进程对文件的任何写操作将失败。所以进程应当使用系统调用umask(0);清除旧有的文件掩码。6.修改守护进程的当前目录每个进程都有一个当前目录,服务进程也是如此。这个当前目录
7、依次关闭,对于已经关闭的文件描述符,close将不产生任何影响。5.消除umask的影响每一个运行的进程都有一个umask同它向关联,它指定进程创建文件的保护掩码。文件掩码是系统提供的一种安全的机制,可以用来限制进程创建文件的权限。守护进程可能会受到文件掩码的影响。比如,进程希望建立一个文件,文件的模式为0777,但是由于进程的文件掩码为0277,则文件实际的属性为0500,而后进程对文件的任何写操作将失败。所以进程应当使用系统调用umask(0);清除旧有的文件掩码。6.修改守护进程的当前目录每个进程都有一个当前目录,服务进程也是如此。这个当前目录
此文档下载收益归作者所有