赞
踩
该数据结构保存了和service相关的信息。service下可以定义option,这些option被保存在这个结构体中;除此之外还保存了service的运行时管理信息,具体如下:
- struct service {
- /* list of all services */
- struct listnode slist;
-
- const char *name; // 名称
- const char *classname; // 类别: default
-
- unsigned flags; // 选项,参见init.h中SVC_宏定义
- pid_t pid; // service所在进程的pid
- time_t time_started; /* time of last start */
- time_t time_crashed; /* first crash within inspection window */
- int nr_crashed; /* number of times crashed within window */
-
- uid_t uid; // effective user ID
- gid_t gid; // effective group ID
- gid_t supp_gids[NR_SVC_SUPP_GIDS]; // supplementary group IDs
- size_t nr_supp_gids; // supp_gids的大小
-
- struct socketinfo *sockets; // 为service创建的sockets
- struct svcenvinfo *envvars; // 为service设置的环境变量
-
- struct action onrestart; /* Actions to execute on restart. */
-
- /* keycodes for triggering this service via /dev/keychord */
- int *keycodes;
- int nkeycodes;
- int keychord_id;
-
- int ioprio_class; // io优先级
- int ioprio_pri;
-
- int nargs; // 参数个数,参见下面的说明
- /* "MUST BE AT THE END OF THE STRUCT" */
- char *args[1]; // service [service name] [args] NULL # 包含了service的参数的个数+1
- }; /* ^-------'args' MUST be at the end of this struct! */
开始解析service节的函数为parse_service()。该函数的主要功能是:创建service对象,解析定义service的行,然后设置service的默认的class为default。
service的option会记录在struct service中,故启动service时,考虑到这些选项即可。同时,会记录下service的pid、状态等。
在init进程中,启动service可以有以下的方式:
1.action下面添加和启动服务相关的command即可。action中和操作服务相关的命令有:
class_start <serviceclass> # 启动所有指定class的服务 2.restart_processes()函数中。该函数位于init的主线程循环中,用来查看有没有需要重新启动的service。具体参考init.c
3.handle_property_set_fd()函数中。通过向socket名称为property_service的属性服务,发送控制的消息可以进入到该函数中。具体可以参考property_service.c
4.handle_keychord()函数中。该函数和chorded keyboard有关,可参阅相关信息
class main的service包括:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。