2017-02-04 108 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

相關問題