skynet_启动流程

本文详细介绍了Skynet的启动过程,从skynet_main.c的main方法开始,解析配置文件,到skynet_start()函数的执行。重点讲解了skynet_context_new()创建Lua虚拟机、启动引导服务bootstrap()、start()方法启动工作线程,以及模块加载和线程管理。特别是skynet_context_message_dispatch方法,它是消息投递与处理的核心。
摘要由CSDN通过智能技术生成

Skynet学习

skynet启动流程
skynet启动的main方法,是在skynet_mian.c文件中,具体实现为

int main(int argc,char* argv[]) {
   
	const char* config_file = NULL; 
	if (argc > 1) {
   
		config_file = argv[1]; //取得配置文件名
	}else{
   
         fprintf(stderr, "Need a config file. Please read skynet wiki : https://github.com/cloudwu/skynet/wiki/Config\n"
             "usage: skynet configfilename\n");
         return 1;
	}
	skynet_globalinit(); //全局初始化
	skynet_env_init(); //环境初始化
	sigign(); //SIGPIPE 信号处理
	struct skynet_config config;
	struct lua_State * L = luaL_newstate();
	luaL_openlibs(L); //link lua lib
	int err = lua_loadbufferx(L,load_config,strlen(load_config), "=[skynet config]","t");
	assert(err == LUA_OK);
	lua_pushstring(L,config_file);
	err = lua_pcall(L,1,1,0);
	if (err) {
   
		fprintf(stderr,"%s\n",lua_tostring(L,-1));
		lua_close(L);
		return 1;
	}
	_init_env(L);
     //从环境读取配置存入skynet_config数据结构中
     config.thread =  optint("thread",8);    //工作线程数
     config.module_path = optstring("cpath","./cservice/?.so");  //模块地址:用C编写的服务模块的位置
     config.harbor = optint("harbor", 1);    //节点编号,为零代表单节点模式
     config.bootstrap = optstring("bootstrap","snlua bootstrap");// skynet 启动的第一个lua服务以及其启动参数
     config.daemon = optstring("daemon", NULL);//配置是否以守护进程启动
     config.logger = optstring("logger", NULL);//配置 skynet_error 输出到什么地方
     config.logservice = optstring("logservice", "logger");
     config.profile = optboolean("profile", 1);
     
     lua_close(L);//关闭虚拟机
     skynet_start(&config);//启动
     skynet_globalexit();//全局退出
 
     return 0;
}

这里主要读取解析配置文件,接下来主要的流程是从 skynet_start(&config)进入,skynet_start()具体如下

void skynet_start(struct skynet_config* config) {
   
	struct sigaction sa;
	sa.sa_handler = &handle_hup;
	sa.sa_flags = SA_RESTART;
	sigfillset(&sa.sa_mask);
	sigaction(SIGHUP,&sa,NULL);
	
	if(config->daemon){
    //以守护进程启动
		if (daemon_init(config->daemon)) {
   
			exit(1);
		}
	}
    //初始化各个组件
     skynet_harbor_init(config->harbor);//harbor初始化
     skynet_handle_init(config->harbor);//句柄初始化
     skynet_mq_init();//消息队列初始化
     skynet_module_init(config->module_path);//模块初始化
     skynet_timer_init();//时钟初始化
     skynet_socket_init
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值