2015-07-28 61 views
1

我写了一个在Ubuntu上完美工作的代码。但在QNX上获得意想不到的行为。如何使用c程序从QNX获取内存信息?

#include <stdio.h> 
#include <stdlib.h> 
#include <limits.h> 
#include <unistd.h> 

int main(void) 
    { 

    printf("Total Memory = %ld MB\n", 
    (sysconf(_SC_PHYS_PAGES)* sysconf(_SC_PAGESIZE))/1048576); 

    printf("Getting available memory...\n"); 
    printf("Available  = %ld MB\n", 
    (sysconf(_SC_AVPHYS_PAGES)* sysconf(_SC_PAGESIZE))/1048576); 

    printf("Getting used memory...\n"); 
    printf("Used Memory = %ld MB\n",((sysconf(_SC_PHYS_PAGES) - 
    sysconf(_SC_AVPHYS_PAGES))* sysconf(_SC_PAGESIZE))/1048576); 

    return EXIT_SUCCESS; 
} 

这在Ubuntu上可以很好地工作,但不能在QNX上工作。 有没有什么不同的方式来做到这一点?

输出:

 Total Memory = - 3906 MB 

    Available = - 3096 MB 

    Used Memory = 0 MB 
+0

什么意外的行为?添加问题描述。 – LPs

+0

@ Lps更新。 3906实际上是页面大小。 –

+0

@sourav戈什不确定。 –

回答

-1

投入的时间很多,我得到一个后我可以做到这一点。

使用:

Showmem -S 

从C编程语言使用管道

FILE *fp; 
pf = popen(command,"r"); 

执行这个命令,那么可以从FP获取数据。

0

我看到在QNX doco page for sysconf约要么_SC_PHYS_PAGES也不_SC_AVPHYS_PAGES什么,但它确实有注:

请求配置的系统限制。如果没有为系统定义名称,则返回-1。

因此,有可能QNX并未实际提供该信息。

您可以通过直接打印sysconf(oneOfThoseTwo)并查看是否得到-1来验证此问题。

如果得到一个体面的价值则可能以算术溢出有关,在这种情况下,你可以调整你的计算,以避免它:

#define MEG 1048576 
(sysconf(oneOfThoseTwo) + MEG - 1)/MEG) * sysconf(_SC_PAGESIZE)