static int read_config_file(const char *config_file_name)
{
FILE *config_file;
int err;
if (config_file_name) {
if (!strcmp(config_file_name, "-"))
config_file = stdin;
else
config_file = fopen(config_file_name, "r");
if (!config_file) {
fprintf(stderr, "Could not open config file\n");
perror(config_file_name);
return 1;
}
} else {
/* Use libsensors default */
config_file = NULL;
}
err = sensors_init(config_file);
if (err) {
fprintf(stderr, "sensors_init: %s\n", sensors_strerror(err));
if (config_file)
fclose(config_file);
return 1;
}
if (config_file && fclose(config_file) == EOF)
perror(config_file_name);
return 0;
}
以下是read_config_file函数的源码。它以一个FILE*调用了sensors_init函数,而这个函数很明显是自己定义的,(这里说很明显的意思是,我也不确定,再也不想犯之前的错误,说什么分析setlocale函数的源码了(不是不可能而没意义)。之前和之后的错误查检真是太丰富了。但这不是主题,如果想看人家的设计理念和编程机巧那么从这些可以看到很多,但现在我的注意力只在于这个功能是怎么实现的。之于像sensors_strerror()这样的函数,可以不会再分析了。下面看看sensors_init()函数。
int sensors_init(FILE *input)
{
int res;
if (!sensors_init_sysfs())
return -SENSORS_ERR_KERNEL;
if ((res = sensors_read_sysfs_bus()) ||
(res = sensors_read_sysfs_chips()))
goto exit_cleanup;
if (input) {
res = parse_config(input, NULL);
if (res)
goto exit_cleanup;
} else {
const char* name;
/* No configuration provided, use default */
input = fopen(name = DEFAULT_CONFIG_FILE, "r");
if (!input && errno == ENOENT)
input = fopen(name = ALT_CONFIG_FILE, "r");
if (input) {
res = parse_config(input, name);
fclose(input);
if (res)
goto exit_cleanup;
} else if (errno != ENOENT) {
sensors_parse_error_wfn(strerror(errno), name, 0);
res = -SENSORS_ERR_PARSE;
goto exit_cleanup;
}
/* Also check for files in default directory */
res = add_config_from_dir(DEFAULT_CONFIG_DIR);
if (res)
goto exit_cleanup;
}
return 0;
exit_cleanup:
sensors_cleanup();
return res;
}
我会一如既往的尽可能短的找到它在一般正常的情况下,调用的函数,和所作的本质工作。比如这个函数,它只是以正确的参数调用parse_config()函数,从文中可以看出这个函数的参数一个是FILE*另一个是字符串。至到这里