シェルとCプログラムの内部でスタックサイズを設定したときの動作の違いを見つけました。問題は、多くのローカル変数(大きな配列)を含む関数があることです。
私が以下を行うと
limit stack 256000
私のCプログラムは失敗せずに実行され続けますが、関数呼び出し時に内部の同じ値がクラッシュします。
関数を呼び出す前に、メインの最初の数行は次のようになります。
struct rlimit lim = {256000*1024, 256000*1024};
int x=setrlimit(RLIMIT_STACK, &lim);
if(x!=0) {
printf("Error in setrlimit);
}
setrlimit はエラーを発行しません。
それ以外は、特定のプラットフォーム(SuSE 11)に固有のものと見なされ、すべてのオペレーティングシステムで発生するわけではありません。
プログラムによって増加したスタックサイズが有効であることをどのように確認しますか?もう一つのことは、setrlimitに大きな値を入れても効果がないということです。
答え1
setrlimit(RLIMIT_STACK)の適用方法はプラットフォームによって異なり、非常に多様です。
プロセスの制限を確実に増やすための最良の方法は、プロセスが開始する前に(あなたの質問で指摘されているように)シェルで設定することです。それ以後は何があっても適用されるからです。発生プロセスはスレッド化されていますか?それとも、プラットフォームが従う実装の具体的な詳細は何ですか?