2017-02-04 60 views
1

我有一个将日志写入日志文件的功能 - write_log()只调用一次函数,让其他函数访问它的返回值?

我需要知道我处理的是什么类型的磁盘,SSD或传统硬盘。我有一个函数:

/* 
* Returns disk type. 
* 
* 0 -> SSD 
* 1 -> HDD 
*/ 
int get_disk_type(void) 
{ 
    int disk_type; 
    char line[line_buf]; 
    FILE * disk_pipe = fopen("/sys/block/sda/queue/rotational", "r"); 

    if(disk_pipe) 
    { 
     fgets(line, sizeof line, disk_pipe); 
     sscanf(line, "%d", &disk_type); 
    } 

    fclose(disk_pipe); 
    return disk_type; 
} 

我想传递disk_type作为参数传递到日志中的消息日志文件的功能。由于该函数调用次数太多,所以无法在任何地方更改write_log()的语法。

我想,也许让write_log()呼叫get_disk_type()但由于write_log()被调用的次数太多,get_disk_type()将被调用几次也和可能妨碍性能(这已经从日志文件确定)。

所以我想知道write_log()访问disk_type的最佳方法是什么?

+1

'popen(“cat ...”)'?为什么不只是“打开”(“...”)? – melpomene

+0

@melpomene是的。将更新它。 –

+0

使用重构IDE(或全局正则表达式搜索/替换)可以轻松地改变对'write_log()'的调用。 – melpomene

回答

4

你可以缓存在一个静态变量的disk_type的价值,因为它不应该在程序运行时改变:

int get_disk_type(void) 
{ 
    static int disk_type = -1; 
    if(disk_type >= 0) 
     return disk_type; 
    // disk type not known yet, check 
    char line[line_buf]; 
    FILE * disk_pipe = popen("cat /sys/block/sda/queue/rotational", "r"); 

    if(disk_pipe) 
    { 
     fgets(line, sizeof line, disk_pipe); 
     sscanf(line, "%d", &disk_type); 
    } 

    pclose(disk_pipe); 
    return disk_type; 
} 
+0

您可以从'write_log'调用'get_disk_type',因为它在缓存值时速度非常快。 – alain

+0

只有第一次调用'get_disk_type'才能完成这项工作,随后的调用将返回以前的值。 – alain

0

如果这里的问题是,get_disk_type内的文件访问速度太慢,你可以考虑缓存它的返回值是这样的:

int get_disk_type(void) 
{ 
    static int disk_type = 2; 

    if(2 == disk_type) 
    { 
     char line[line_buf]; 
     FILE * disk_pipe = popen("cat /sys/block/sda/queue/rotational", "r"); 
     if(disk_pipe) 
     { 
      fgets(line, sizeof line, disk_pipe); 
      sscanf(line, "%d", &disk_type); 
     } 

     pclose(disk_pipe); 
    } 
    return disk_type; 
} 

这里我用“2”,只是因为这是无法返回的值您的评论说,所以它可以充当一个“无效”标记。 “静态”的使用意味着这个变量在函数调用之间持续存在。因此文件访问只会在第一次调用该函数时发生。

+2

和@ alain的答案一样,除了初始值的优先选择。 – Barmar

+0

是的,他打败了我。 – Carl

相关问题