ulimit を使用したプロセスの最大メモリ制限の設定

ulimit を使用したプロセスの最大メモリ制限の設定

そのため、Cではメモリリークが発生しやすいことを学びました。

#include <stdio.h>
void main() {
    int* p;
    int i=0;
    
    p=(int*)malloc(sizeof(int));
    while (p!=NULL) {
        p=(int*)malloc(sizeof(int));
        i++;
    }
    printf("malloc failed after %d allocations\n",i);
}

このプログラムを起動するたびにコンピュータを再起動しない、または遅すぎる前にプログラムを終了する方法を知りたいです。

ulimit解決策のようです。ulimit -S -m 1000000これにより、プロセスが1000000kbyte / 1gbyte以上のメモリを占有するのを防ぎます(RAMは32gbyteです)。しかし、まったく効果がないようです。上記のプログラムの起動時にプログラムを終了しない場合は、すべてのメモリを使用してください。

非常に低い制限(100kbyte ...)を設定したり、-vRSSの代わりに仮想メモリ制限()を設定してみましたが、何の効果もありませんでした...

私が逃したものは何ですか?

答え1

ulimit -m限られた常駐セットサイズプロセス数 - つまり、一度に呼び出すことができるプロセス部分の数。

スワップ領域が利用可能な場合、プロセスの仮想メモリがはるかに大きくなる可能性があります。

ulimit -v割り当てることができる仮想メモリの量を制限します。これがまさに欲しいものです。必ずしも子プロセスによって継承されるわけではないので、サブシェルを使用して次のようにしますexec

( ulimit -v 1000000 && exec test_program )

答え2

Ram(ほとんどのUnixシステムでは)は、最初の書き込み時に遅延割り当てられます。 malloc() から返されたポインタには書き込みません。

関連情報