设计
D-Bus server
时要注意的若干问题
- Server的定义
- 精灵化,后台化
- 事件循环和电量消耗
- 支持并行处理能力
- 调试
Server
的定义
就软件而言,
server
一般理解成:能为
client
提供服务的软件组件。在
Linux
中,
server
一般是
daemon
的形式运行的。
Daemon
是一个术语:
daemon
是同
terminal
剥离的这么一个进程,一般运行于后台,处理一些用户不需要看见的动作。
有时候,你可能会听见人们把
server
称作
engine
。
Engine
是个更通用的一个术语,
Engine
和如何实现一个服务没有太大的关系
(Engine
可以单独作为一个进程;可以作为一个库,由
client
直接调用
)
。更广泛点讲:
Engine
是应用程序的一部分,主要是实现部分功能,但不是
interface
。在
Model-View-Controller
模型中,
Engine
相当于
Model
。
目前为止,我们的
server
程序并不是以
deamon
的形式运行的,主要是想在
terminal/
屏幕上看到更多的打印信息。如果我们运行
server
程序时,加个参数:
"--stay-on-foreground" ,
这样,我们的
server
就不会被“精灵化”,而保持在前台运行。对于调试,这是非常重要的。
默认情况下,一个
server
程序被
daemonize
后,它的输入
/
输出文件就会关闭了,这时再从
terminal
读取用户输入,或者写数据到
terminal
都会失败
(
包括
printf
和
g_print)
。
Daemonization(
精灵化
)
把一个进程
process
转化为一个后台
daemon
的目的就是想把它同其父进程剥离开,并为它单独创建一个会话。这样剥离是有好处的:
server
的父进程不会自动关闭
server
了。把一个
process
变成
daemon
的过程如下:
- fork 一个新的子进程,原进程推出,子进程进入init process中;
- 用setsid为子进程创建一个新的会话;
- 从当前工作目录切换至root目录,因此daemon不会阻止文件系统的正常卸载;
- 对daemon创建的目录和文件设置umask值,不如其他进程访问。在Internet Tablet产品中,没有这样做,因为只有一个用户;
- 关闭所有的标准I/O文件描述符,为了在terminal关闭时不致于产生SIGPIPE信号给daemon。并且把所有的stdin, stdout, stderr只想/dev/null,这样所有的打印将会丢失掉。
函数
daemon
可以让你切换目录并且关闭已经打开的文件描述符:
#ifndef
NO_DAEMON
/* This will attempt to daemonize this process. It will switch this