service的啓動控制

init.rc中聲明某個服務:

service sample_service /system/bin/sample_service
     disabled
     oneshot


啓動這個服務: 

property_set("ctl.start","sample_service");

結束這個服務:

property_set("ctl.stop","sample_service");


看了源碼,還可以重啓它。

property_set("ctl.restart","sample_service");


相關源碼:

property_service.c

void handle_property_set_fd()
{
        if(memcmp(msg.name,"ctl.",4) == 0) {
            // Keep the old close-socket-early behavior when handling
            // ctl.* properties.
            close(s);
            if (check_control_perms(msg.value, cr.uid, cr.gid, source_ctx)) {
                handle_control_message((char*) msg.name + 4, (char*) msg.value);
            } else {
                ERROR("sys_prop: Unable to %s service ctl [%s] uid:%d gid:%d pid:%d\n",
                        msg.name + 4, msg.value, cr.uid, cr.gid, cr.pid);
            }
        } 
}

init.c

void handle_control_message(const char *msg, const char *arg)
{
    if (!strcmp(msg,"start")) {
        msg_start(arg);
    } else if (!strcmp(msg,"stop")) {
        msg_stop(arg);
    } else if (!strcmp(msg,"restart")) {    //重啓
        msg_stop(arg);
        msg_start(arg);
    } else {
        ERROR("unknown control msg '%s'\n", msg);
    }
}

有些服務,需要參數,怎麼傳?找不到相關的資料,看代碼:

static void msg_start(const char *name)
{
    struct service *svc;
    char *tmp = NULL;
    char *args = NULL;

    if (!strchr(name, ':'))
        svc = service_find_by_name(name);
    else {
        tmp = strdup(name);
        args = strchr(tmp, ':');
        *args = '\0';
        args++;

        svc = service_find_by_name(tmp);
    }

    if (svc) {
        service_start(svc, args);
    } else {
        ERROR("no such service '%s'\n", name);
    }
    if (tmp)
        free(tmp);
}

看來在“:”後面加參數就可以了。例如:

property_set("ctl.start","sample_service:arg0");


如果要加入多個參數,不知道是否和命令行中一樣,用空格分隔即可。實測:

//sample_service.c
int main(int argc,char *argv[])
{
	char *arg0, *arg1;

	if(argc < 3)
	{
		printf("param num: %d\n", argc);
		return 1;
	}

	arg0 = *++argv;
	arg1= *++argv;

	printf("arg0=%s, arg1=%s\n", arg0, arg1);
}

調用:

property_set("ctl.start","sample_service:hello world");

輸出結果:

hello, world

測試成功



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章