Unix-system-calls-getrlimit

提供:Dev Guides
移動先:案内検索

[top]#

[[File:]]

[[File:]]

|Web |This Site

  • 初心者向けのUnix *
  • 高度なUnix *

選択した読書

Copyright©2014 by finddevguides

  Home     References     Discussion Forums     About TP  

getrlimit()-Unix、Linuxシステムコール

[[File:]] image :http://www.finddevguides.com/images/next.gif [next] image:http://www.finddevguides.com/add- this.gif [AddThisソーシャルブックマークボタン]

広告

NAME

getrlimit、setrlimit-リソース制限の取得/設定

概要

  • #include <sys/time.h> * *#include <sys/resource.h> *
*int getrlimit(int* __resource __ **、struct rlimit ** *__ rlim __* *); ** *int setrlimit(int* __resource __ **、const struct rlimit ** *__ rlim __* *); **

説明

*getrlimit* ()および *setrlimit* ()は、それぞれリソース制限を取得および設定します。 各リソースには、_rlimit_構造体( *getrlimit* ()および *setrlimit* ()の両方に対する_rlim_引数)で定義されているように、ソフト制限とハード制限が関連付けられています。
struct rlimit { rlim_t rlim_cur; /*Soft limit*/ rlim_t rlim_max; /*Hard limit (ceiling for rlim_cur)*/ };

ソフト制限は、カーネルが対応するリソースに適用する値です。 ハード制限はソフト制限の上限として機能します。非特権プロセスは、ソフト制限を0からハード制限までの範囲の値にのみ設定し、ハード制限を(不可逆的に)下げることができます。 特権プロセス(Linuxの場合: CAP_SYS_RESOURCE 機能を持つプロセス)は、いずれかの制限値に任意の変更を加えることができます。

RLIM_INFINITY は、リソースに制限がないことを示します( getrlimit ()によって返される構造と setrlimit ()に渡される構造の両方)。

_resource_は次のいずれかでなければなりません。

Tag

説明

*RLIMIT_AS*

プロセスの仮想メモリ(アドレススペース)の最大サイズ(バイト単位)。 この制限は、 brk (2)、 mmap (2)、および mremap (2)の呼び出しに影響し、この制限を超えるとエラー ENOMEM で失敗します。 また、自動スタック拡張は失敗します( sigaltstack (2)を介して代替スタックが利用できない場合、プロセスを強制終了する SIGSEGV を生成します)。 値は_long_であるため、32ビット_long_のマシンでは、この制限は最大2 GiBであるか、このリソースは無制限です。

*RLIMIT_CORE*

_core_ファイルの最大サイズ。 0の場合、コアダンプファイルは作成されません。 ゼロ以外の場合、大きなダンプはこのサイズに切り捨てられます。

*RLIMIT_CPU*

秒単位のCPU時間制限。 プロセスがソフト制限に達すると、 SIGXCPU シグナルが送信されます。 このシグナルのデフォルトのアクションは、プロセスを終了することです。 ただし、シグナルをキャッチでき、ハンドラーは制御をメインプログラムに戻すことができます。 プロセスがCPU時間を消費し続ける場合、ハード制限に達するまで1秒に1回 SIGXCPU が送信され、その時点で SIGKILL が送信されます。 (後者のポイントでは、Linux 2.2から2.6の動作について説明します。 実装は、ソフト制限に達した後もCPU時間を消費し続けるプロセスの処理方法が異なります。 このシグナルをキャッチする必要があるポータブルアプリケーションは、 SIGXCPU を最初に受信したときに正常に終了する必要があります。

*RLIMIT_DATA*

プロセスのデータセグメントの最大サイズ(初期化データ、未初期化データ、およびヒープ)。 この制限は brk ()および sbrk ()の呼び出しに影響し、このリソースのソフト制限に達するとエラー ENOMEM で失敗します。

*RLIMIT_FSIZE*

プロセスが作成できるファイルの最大サイズ。 この制限を超えてファイルを拡張しようとすると、 SIGXFSZ シグナルが配信されます。 デフォルトでは、このシグナルはプロセスを終了しますが、プロセスは代わりにこのシグナルをキャッチできます。その場合、関連するシステムコール(たとえば、 write () truncate ())はエラー EFBIG で失敗します。

*RLIMIT_LOCKS* (Early Linux 2.4のみ)

このプロセスが確立できる flock ()ロックと fcntl ()リースの合計数の制限。

*RLIMIT_MEMLOCK*

RAMにロックできるメモリの最大バイト数。 実際には、この制限はシステムページサイズの最も近い倍数に切り捨てられます。 この制限は、 mlock (2)および mlockall (2)および mmap (2) MAP_LOCKED 操作に影響します。 Linux 2.6.9以降、 shmctl (2) SHM_LOCK 操作にも影響します。この操作では、実際のユーザーによってロックされる可能性のある共有メモリセグメント( shmget (2)を参照)の合計バイトの最大値を設定します。呼び出しプロセスのID。 shmctl (2) SHM_LOCK ロックは、 mlock (2)、 mlockall (2)、および mmap (2) MAP_LOCKED によって確立されたプロセスごとのメモリロックとは別に考慮されます。これらの2つのカテゴリのそれぞれで、プロセスはこの制限までバイトをロックできます。 2.6.9より前のLinuxカーネルでは、この制限が特権プロセスによってロックされる可能性のあるメモリ量を制御していました。 Linux 2.6.9以降、特権プロセスがロックできるメモリ量に制限はなく、この制限が、特権のないプロセスがロックできるメモリ量を決定します。

*RLIMIT_MSGQUEUE* (Linux 2.6.8以降)

呼び出しプロセスの実際のユーザーIDのPOSIXメッセージキューに割り当てることができるバイト数の制限を指定します。 この制限は、 mq_open (3)に適用されます。 ユーザーが作成する各メッセージキューは、式に従ってこの制限に対してカウントされます(削除されるまで)。

bytes = attr.mq_maxmsg *sizeof(struct msg_msg* ) + attr.mq_maxmsg * attr.mq_msgsize

ここで、_attr_は、 mq_open ()の4番目の引数として指定された_mq_attr_構造体です。

sizeof(struct msg_msg *)(Linux/x86の場合は4バイト)を含む式の最初の加数は、ユーザーが無制限の数のゼロ長メッセージを作成できないことを保証します(それにもかかわらず、これらのメッセージはそれぞれ簿記のためにシステムメモリを消費します)オーバーヘッド)。

*RLIMIT_NICE* (カーネル2.6.12以降、ただし以下のバグを参照)
*setpriority* (2)または *nice* (2)を使用してプロセスのnice値を上げることができる上限を指定します。 nice値の実際の上限は、_20-rlim_cur_として計算されます。 (負の数は通常、特別な意味を持つため、リソース制限値として指定できないため、この奇妙な現象が発生します。 たとえば、RLIM_INFINITYは通常、-1と同じです。
*RLIMIT_NOFILE*

このプロセスで開くことができる最大ファイル記述子番号より1つ大きい値を指定します。 この制限を超えようとすると( open ()、 pipe ()、 dup ()など)エラー EMFILE が発生します。

*RLIMIT_NPROC*

呼び出しプロセスの実ユーザーIDに対して作成できるスレッドの最大数。 この制限に達すると、 fork ()はエラー EAGAIN で失敗します。

*RLIMIT_RSS*

プロセスの常駐セット(RAMに常駐する仮想ページの数)の制限(ページ単位)を指定します。 この制限はLinux 2.4.x、x <30でのみ有効で、 MADV_WILLNEED を指定する madvise ()の呼び出しにのみ影響します。

*RLIMIT_RTPRIO* (Linux 2.6.12以降、バグを参照)
*sched_setscheduler* (2)および *sched_setparam* (2)を使用して、このプロセスに設定できるリアルタイム優先度の上限を指定します。
*RLIMIT_SIGPENDING* (Linux 2.6.8以降)

呼び出しプロセスの実際のユーザーIDのキューに入れることができるシグナルの数の制限を指定します。 この制限を確認するために、標準信号とリアルタイム信号の両方がカウントされます。 ただし、制限は sigqueue (2)にのみ適用されます。 kill (2)を使用して、プロセスのキューにまだ入っていないシグナルの1つのインスタンスを常にキューに入れることができます。

*RLIMIT_STACK*

プロセススタックの最大サイズ(バイト単位)。 この制限に達すると、 SIGSEGV シグナルが生成されます。 このシグナルを処理するには、プロセスは代替シグナルスタック( sigaltstack (2))を使用する必要があります。

*RLIMIT_OFILE* は、 *RLIMIT_NOFILE* のBSD名です。

返り値

成功すると、ゼロが返されます。 エラーの場合、-1が返され、_errno_が適切に設定されます。

エラー

Tag Description
EFAULT rlim points outside the accessible address space.
*EINVAL * resource is not valid; or, for* setrlimit*(): rlim→rlim_cur was greater than rlim→rlim_max.
*EPERM * An unprivileged process tried to use* setrlimit*() to increase a soft or hard limit above the current hard limit; the CAP_SYS_RESOURCE *capability is required to do this. Or, the process tried to use setrlimit*() to increase the soft or hard RLIMIT_NOFILE limit above the current kernel maximum (NR_OPEN).

BUGS

古いLinuxカーネルでは、プロセスがソフトおよびハードの RLIMIT_CPU 制限に達したときに配信される SIGXCPU および SIGKILL シグナルは、本来よりも1(CPU)秒遅れて配信されました。 これはカーネル2.6.8で修正されました。

2.6.17より前の2.6.xカーネルでは、0の RLIMIT_CPU 制限が「 RLIM_INFINITY 」のように「制限なし」として誤って処理されます。 カーネル2.6.17以降、制限を0に設定しても効果はありますが、実際には1秒の制限として扱われます。

カーネルのバグは、 RLIMIT_RTPRIO がカーネル2.6.12で機能しないことを意味します。この問題はカーネル2.6.13で修正されています。

カーネル2.6.12では、 getpriority (2)と RLIMIT_NICE によって返される優先順位の範囲に1対1の不一致がありました。 これにより、ナイス値の実際の上限が_19-rlim_cur_として計算されるという効果がありました。 これはカーネル2.6.13で修正されました。

2.4.22より前のカーネルは、_rlim→ rlim_cur_が_rlim→ rlim_max_より大きい場合、 setrlimit ()のエラー EINVAL を診断しませんでした。

ノート

*fork* (2)で作成された子プロセスは、親のリソース制限を継承します。 リソース制限は、 *execve* (2)全体にわたって保持されます。

準拠

SVr4、4.3BSD、POSIX.1-2001。 RLIMIT_MEMLOCK および RLIMIT_NPROC はBSDから派生しており、POSIX.1-2001では指定されていません。それらはBSDとLinuxに存在しますが、他の実装にはほとんどありません。 RLIMIT_RSS はBSDから派生しており、POSIX.1-2001では指定されていません。それにもかかわらず、ほとんどの実装に存在します。 RLIMIT_MSGQUEUERLIMIT_NICERLIMIT_RTPRIO 、および RLIMIT_SIGPENDING はLinux固有です。

関連項目

[[File:]] image :http://www.finddevguides.com/images/next.gif [next] [[File:]]

広告

  
Advertisements