接着上一篇博文ROS源代码阅读(3):ROS程序的初始化——this_node::init()。在此文中我们继续探讨的是ROS环境的初始化——file_log::init()和param::init()函数。
1.file_log::init()函数
从file_log::init()的名字我们可以猜测,该函数用于对日志文件的初始化。
file_log::init()函数定义在./src/ros_comm/roscpp/src/libros/file_log.cpp
中,具体实现代码和注释如下:
void init(const M_string& remappings)
{
std::string log_file_name;
M_string::const_iterator it = remappings.find("__log");
//在remappings中找到键为"__log"的项
if (it != remappings.end())
{
log_file_name = it->second; //如果找到了,将对应的值赋值给log_file_name
}
{
// Log filename can be specified on the command line through __log
// If it's been set, don't create our own name
if (log_file_name.empty())//如果log_file_name是个空串
{
// Setup the logfile appender
// Can't do this in rosconsole because the node name is not known
pid_t pid = getpid();//获取当前进程号
std::string ros_log_env;
if ( get_environment_variable(ros_log_env, "ROS_LOG_DIR"))//获取"ROS_LOG_DIR"的环境变量值
{
log_file_name = ros_log_env + std::string("/");//在获取的环境变量后面增加“/”
}
else//如果不存在"ROS_LOG_DIR"这个环境变量
{
if ( get_environment_variable(ros_log_env, "ROS_HOME"))//获取"ROS_HOME"的环境变量值
{
log_file_name = ros_log_env + std::string("/log/");//在获取的环境变量后面增加“/log/”
}
else//如果不存在环境变量"ROS_HOME"
{
if( get_environment_variable(ros_log_env, "HOME") )//获取"ROS_HOME"的环境变量值
{
std::string dotros = ros_log_env + std::string("/.ros/");//在获取的环境变量后面增加“/.ros/”
fs::create_directory(dotros);//创建相应文件夹
log_file_name = dotros + "log/";
fs::create_directory(log_file_name);//创建相应文件夹
}
}
}//end of "else//如果不存在"ROS_LOG_DIR"这个环境变量
//处理节点的名字,并接到log_file_name后面
for (size_t i = 1; i < this_node::getName().length(); i++)
{
if (!isalnum(this_node::getName()[i]))
{
log_file_name += '_';
}
else
{
log_file_name += this_node::getName()[i];
}
}
char pid_str[100];
snprintf(pid_str, sizeof(pid_str), "%d", pid);//将pid以整形变量的形式写入pid_str
log_file_name += std::string("_") + std::string(pid_str) + std::string(".log");
}
//返回log_file_name对应文件的完整路径
log_file_name = fs::s