Как получить информацию о памяти из QNX с помощью программы c?

Я написал код, который отлично работает на Ubuntu. Но получаю неожиданное поведение на 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

person Bharat Jain    schedule 28.07.2015    source источник
comment
Какое неожиданное поведение? Добавьте описание проблемы.   -  person LPs    schedule 28.07.2015
comment
@Lps обновлен. 3906 - это размер страницы на самом деле.   -  person Bharat Jain    schedule 28.07.2015
comment
@sourav Гош не уверен.   -  person Bharat Jain    schedule 28.07.2015


Ответы (2)


Я ничего не вижу в Документальная страница QNX для sysconf о _SC_PHYS_PAGES или _SC_AVPHYS_PAGES, но на ней есть примечание:

Запрошенный настраиваемый предел системы. Если имя не определено для системы, возвращается -1.

Таким образом, вполне возможно, что эта информация фактически не предоставляется QNX.

Вы можете проверить это, распечатав sysconf(oneOfThoseTwo) напрямую и посмотрев, получится ли -1.

Если вы действительно возвращаете приличное значение, это может быть связано с арифметическим переполнением, и в этом случае вы можете изменить структуру вычислений, чтобы избежать этого:

#define MEG 1048576
(sysconf(oneOfThoseTwo) + MEG - 1) / MEG) * sysconf(_SC_PAGESIZE)
person paxdiablo    schedule 28.07.2015

Потратив много времени, я нашел способ сделать это.

С использованием:

Showmem -S

Чтобы выполнить эту команду из языка программирования c, используйте канал

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

Затем вы можете получить данные из fp.

person Bharat Jain    schedule 03.08.2015