总结如何创建一个守护进程 您所在的位置:网站首页 守护进程创建步骤包括 总结如何创建一个守护进程

总结如何创建一个守护进程

2024-07-10 20:31| 来源: 网络整理| 查看: 265

子进程属于父进程所在的进程组。  

一个进程除了有进程ID外,还有一个进程组ID,每个进程组也有唯一的进程组ID。

每个进程组有一个进程组组长,进程组组长的进程ID和组ID相同

会话     ---------------------------------------------      会话期则是一个或多个进程组的集合。当一个用户登陆一次终端时就会产生一个会话,每个会话有一个会话首进程,即创建会话的进程,建立与终端连接的就是这个会话首进程,也被称为控制进程。通常情况下,用户登录后所执行的所有程序都属于一个会话期,而其登录shell则是会话期首进程,并且它所使用的终端就是会话期的控制终端。当我们退出登录(logout)时,所有属于这个会话期的进程都将被终止。      (1). 一次登录形成一个会话      (2). 一个会话可包含多个进程组, 但只能有一个前台进程组.      (3). setsid()可建立一个新的会话;如果调用该函数的进程不是进程组的领头进程, 该函数才能建立新的会话.  调用setsid()之后, 调用进程将成为新会话的领头进程.    控制终端  ---------------------------------------------      (1) 会话的领头进程打开一个终端之后, 该终端就成为该会话的控制终端 (SVR4/Linux)      (2) 与控制终端建立连接的会话领头进程称为控制进程 (session leader)      (3) 一个会话只能有一个控制终端      (4) 产生在控制终端上的输入和信号将发送给会话的前台进程组中的所有进程      (5) 终端上的连接断开时(比如网络断开或Modem断开), 挂起信号将发送到控制进程(session leader)

怎样编写守护进程:

1. 在后台运行。     调用fork产生一个子进程,然后释放掉父进程,也就是说创建一个孤儿进程,此时子进程已经成为后台进程。     if(pid=fork())      exit(0);//是父进程,结束父进程,子进程继续  这么做不仅实现了让进程后台运行,同事保证了子进程是父进程创建的,属于父进程所在进程组,所以保证了子进程一定不是进程组组长,为了下一步脱离终端提供保证。 2. 脱离控制终端,登录会话和进程组          控制终端,登录会话和进程组通常是从父进程继承下来的。我们的目的就是要摆脱它们,使之不受它们的影响。方法是在第1点的基础上,调用setsid()使进程成为会话组长: 调用setsid有下面的3个作用: (1)让进程摆脱原会话的控制 (2)让进程摆脱原进程组的控制 (3)让进程摆脱原控制终端的控制  也就是说由于创建守护进程的第一步调用了fork函数来创建子进程,再将父进程退出。由于在调用了fork函数时,子进程全盘拷贝了父进程的会话期、进程组、控制终端等,虽然父进程退出了,但会话期、进程组、控制终端等并没有改变,因此,这还不是真正意义上的独立开来,而setsid函数能够使进程完全独立出来,从而摆脱其他进程的控制。 说明:当进程是会话组长时setsid()调用失败。但第一点已经保证进程不是会话组长。setsid()调用成功后,进程成为新的会话组长和新的进程组长,并与原来的登录会话和进程组脱离。由于会话过程对控制终端的独占性,进程同时与控制终端脱离。 

3. 禁止进程重新打开控制终端       现在,进程已经成为无终端的会话组长。但它可以重新申请打开一个控制终端。可以通过使进程不再成为会话组长来禁止进程重新打开控制终端:      if(pid=fork())      exit(0);//结束第一子进程,第二子进程继续(第二子进程不再是会话组长)  为什么要创建两次进程呢? 这是因为第二步结束后,进程创建了一个新的会话组,并成为会话组长,而会话组长可能获得控制终端,如果获得了控制终端那么或这个进程就不是守护进程了。所以添加了这几句代码,让进程失去会话组长的身份,从而没有获得控制终端的权限。 4. 关闭打开的文件描述符  同文件权限码一样,用fork函数新建的子进程会从父进程那里继承一些已经打开了的文件。这些被打开的文件可能永远不会被守护进程读写,但它们一样消耗系统资源,而且可能导致所在的文件系统无法卸下。 在上面的第二步之后,守护进程已经与所属的控制终端失去了联系。因此从终端输入的字符不可能达到守护进程,守护进程中用常规方法(如printf)输出的字符也不可能在终端上显示出来。所以,文件描述符为0、1和2 的3个文件常说的输入、输出和报错)已经失去了存在的价值,也应被关闭。通常按如下方式关闭文件描述符: for(i=0;i



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有