web-dev-qa-db-ja.com

ulimit -sによるスタックサイズの変更

ターミナルでulimit -sと入力すると、8192と表示されます。私のCコードでは8192バイトのローカル変数しか持てないということですか?

スタックサイズがわかりません。値を変更すると、ulimit -sは変わりますか?

6
user2383973

まず、8192kiloバイトであり、バイトではありません。さらに、スタックはあるもの、変数は別のもの、そしてヒープは別のものです。たとえば、スタックとヒープの違いの この説明 、または このページ を参照してください。私の知る限り、スタックはローカル変数と短命変数に使用され、スタックまたはヒープが使用されるかどうかはコンパイラに依存します。

私が知る限り、[mc]allocと友人を使用してメモリを割り当てる場合、スタックに触れず、制限は適用されません。

しかし、はい、8192に等しいulimit -sで次を試みると、セグメンテーションエラーが発生します。

#include <stdlib.h>

int main() {
  char foo[10000000] ;
  foo[0] = 'a' ;
  exit( 0 ) ;
}

ここでは、変数fooが大きすぎます。

$ gcc test.c
$ ./a.out
Segmentation fault (core dumped)

ただし、ulimit(たとえば、ulimit -s 16000)を変更すると、機能します。

10
January