第13章 守护进程

版权声明:转载请声明 https://blog.csdn.net/qq_40732350/article/details/82753618

请移步到这:

http://note.youdao.com/noteshare?id=71c3766867abb8bfbc459c415da88cfb&sub=03BC97B943C94432A6A769D31766E1C3

13.2 守护进程的特征

注意,大多数守护进程都以超级用户(root)特权运行。所有的守护进程都没有控制终端,其终端名设置为问号。

内核守护进程以无控制终端方式启动。用户层守护进程缺少控制终端可能是守护进程调用了setsid的结果。

大多数用户层守护进程都是进程组的组长进程以及会话的首进程,而且是这些进程组和会话中的唯一进程(rsyslogd是一个例外)

用户层守护进程的父进程是init进程。

13.3 编写规则

13.4 出错记录

大多数sysloq实现将使消息短时间处于队列中。如果在此段时间中有重复消息到达,那么 sysloq守护进程不会把它写到日志记录中,

而是会打印输出一条类似于“上一条消息重复了N次”的消息。

13.5 单例程守护进程

(1)因为守护进程是长时间运行而不退出,因此./a.out执行一次就有一个进程,执行多次就有多个守护进程。

(2)这样并不是我们想要的。我们守护进程一般都是服务器,服务器程序只要运行一个就够了,多次同时运行并没有意义甚至会带来错误。

(3)当个多个守护进程访问同一个设备时,会出现问题

要解决就要在访问上面加一些限制:

如使用文件锁

13.6 守护进程的惯例

13.6 守护进程的惯例

守护进程常常用作服务器进程。确实,我们可以称图13-2中的syslogd进程为服务器进程,用户进程(客户进程)用UNIX域数据报套接字向其发送消息。

一般而言,服务器进程等待客户进程与其联系,提出某种类型的服务要求。图13-2中,由 syslogd服务器进程提供的服务是将一条出错消息记录到日志文件中。

图13-2中,客户进程和服务器进程之间的通信是单向的。客户进程向服务器进程发送服务请求,服务器进程则不向客户进程回送任何消息。在下面有关进程通信的几章中,我们将见到大量客户进程和服务器进程之间双向通信的实例。客户进程向服务器进程发送请求,服务器进程则向客户进程回送应答。

在服务器进程中调用fork然后exec另一个程序来向客户进程提供服务是很常见的。

这些服务器进程通常管理着多个文件描述符:通信端点、配置文件、日志文件和类似的文件。

最好的情况:

让子进程中的这些文件描述符保持打开状态并无大碍,因为它们很可能不会被在子进程中执行的程序所使用,尤其是那些与服务器端无关的程序。

最坏情况:

保持它们的打开状态会导致安全问题-被执行的程序可能有一些恶意行为,如更改服务器端配置文件或欺骗客户端程序使其认为正在与服务器端通信,从而获取未授权的信息。

解决此问题的一个简单方法是对所有被执行程序不需要的文件描述符设置执行时关闭, (close-on-exec)标志。图13-9展示了一个可以用来在服务器端进程中执行上述工作的函数。

fcntl的close-on-exec标志

每个文件描述符都有一个close-on-exec标志。默认情况下,这个标志最后一位被设置为 0。这个标志符的具体作用在于当开辟其他进程调用exec()族函数时,在调用exec函数之前为exec族函数释放对应的文件描述符。

参考:

https://blog.csdn.net/justmeloo/article/details/40184039

int flags = fcntl(fd, F_GETFD);

flags |= FD_CLOEXEC;

 fcntl(fd, F_SETFD, flags);

猜你喜欢

转载自blog.csdn.net/qq_40732350/article/details/82753618