LINUX.ORG.RU

#include <sys/sysinfo.h>
#include <iostream>

int main(int argc, char** argv)
{
struct sysinfo si;

sysinfo(&si);
std::cout << "totalram: " << si.totalram << ", freeram: " << si.freeram << std::endl;

char* ptr = new char [50000000];

sysinfo(&si);
std::cout << "totalram: " << si.totalram << ", freeram: " << si.freeram << std::endl;

delete [] ptr;

return 0;
}

anonymous2 ★★★★★
() автор топика
Ответ на: комментарий от anonymous2

получаю:
totalram: 489457, freeram: 44657
totalram: 489457, freeram: 44657

что это за цифири я не понял.. у меня в limits.conf
* - as 600000
ну и
$ free
total used free shared buffers cached
Mem: 1957828 1779200 178628 0 273032 1014708
-/+ buffers/cache: 491460 1466368
Swap: 3122272 9400 3112872

anonymous2 ★★★★★
() автор топика

насколько я помню — никак. точнее, если malloc(9) вернул NULL, значит память кончилась.

beastie ★★★★★
()

мне нужно linux специфичное решение

anonymous2 ★★★★★
() автор топика
Ответ на: комментарий от anonymous2

опять таки, не берусь утверждать на 100%, но IMO из userspace твоя задача решения не имеет. для процессов память безгранична, пока malloc другого не скажет.

beastie ★★★★★
()
Ответ на: комментарий от beastie

а если пойти другим путем, я вытащу из исходников как там ulimit -v откуда и что читает, далее мне нужно узнать: сколько у меня использовано (как пользователя), потом нужное мне я простым вычитанием найду.. такое возможно?!

anonymous2 ★★★★★
() автор топика
Ответ на: комментарий от anonymous2

лимит я получил через strace это getrlimit(RLIMIT_AS.., понятно что если лимитов нет я возьму TotalMem из meminfo
а как мне теперь узнать у системы сколько памяти использовано под пользователем?

anonymous2 ★★★★★
() автор топика
Ответ на: комментарий от anonymous2

getrlimit(2) тут ты узнаеш про установленные лимиты

beastie ★★★★★
()
Ответ на: комментарий от anonymous2

задача свелась к чтению всех statm из /proc для пользователя
может кому пригодится, это работает, но меня не покидает ощущение что все это как то через одно место)))

anonymous2 ★★★★★
() автор топика
Ответ на: комментарий от beastie

> осмелюсь таки спросить, какого чёрта это вообще понадобилось?
помогаю портировать одну самописную систему, там было GlobalMemoryStatus, dwAvailVirtual.
не хотелось бы объясняться, что это не возможно в linux системах и т.п.

anonymous2 ★★★★★
() автор топика
Ответ на: комментарий от anonymous2

> char* ptr = new char [50000000];

пока она не забита нулями, ты можешь (на 64-битной системе) аллоцировать хоть 200 терабайт на тачке с 3ГБ.

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

пока она не забита нулями, ты можешь (на 64-битной системе) аллоцировать хоть 200 терабайт на тачке с 3ГБ.


тут вдруг подошел www_linux_org_ru, и говорит, мне ваше творчество очень импонирует... классика программирования.... в народной мизансцене делает вашу программу просто многогранной, а я такой сижу читаю все это и думаю: да да да да.. (С) КВН

#include <iostream>
#include <sstream>
#include <fstream>

unsigned int Usage(void)
{
unsigned int size = 0;
std::ostringstream os;
os << «/proc/» << getpid() << «/statm»;
std::fstream fs(os.str().c_str(), std::ios::in);
if(fs.good())
{
fs >> size;
fs.close();
}
return size * getpagesize() / 1024;
}

int main(int argc, char** argv)
{
std::cout << «size: » << Usage() << std::endl;
char* ptr = new char [50000000];
std::cout << «size: » << Usage() << std::endl;
delete [] ptr;
return 0;
}

p.s. этот код, вдруг почему то, работает корректно и на 64 битах и на 32 битах без забивания нулями. и к сожалению, насчет «200 терабайт на тачке с 3ГБ.»
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
это как бы лимит сработал...

anonymous2 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.