C言語,プロセスがオープンできるファイルディスクリプタの数を取得

スポンサーリンク

鍛錬 941

C言語,プロセスがオープンできるファイルディスクリプタの数を取得

getrlimit()関数を使用すると様々なリソースの上限を取得することができるため、プロセスがオープンできるファイルディスクリプタの上限を取得することもできます。

以下は、getrlimit()関数についてです。

#include <sys/time.h>
#include <sys/resource.h>

int getrlimit(int resource, struct rlimit *rlim);
 

引数

以下は、上記の引数についてです。

引数 意味
int resource 取得するリソース
struct rlimit *rlim リソースの上限

rlim に RLIM_INFINITY が返された場合は、リソースに制限が無いことを意味します。

引数 resource について

引き数 resource に、取得対象のリソースを指定します。

以下は、プロセスがオープンできるファイルディスクリプタ数の上限を取得する際に指定する引数です。

RLIMIT_NOFILE
オープン可能なファイルディスクリプタ数の上限

上記に示した引数の他にも、「プロセスが作成できるファイルサイズの上限」や「CPU時間の上限」等を取得する引数が存在します。

構造体

以下は、構造体 rlimit についてです。

 
struct rlimit {
	rlim_t rlim_cur;	// ソフトリミット
	rlim_t rlim_max;	// ハードリミット
};
 

特権を持たないプロセスは、以下の操作を実行することができます。

  • ソフトリミットの値を「0 ~ ハードリミット」の範囲で変更することができます。
  • ハードリミットを下げることができますが、上げることはできません。(一度下げたハードリミットを上げることはできません)

特権を持つプロセス(CAP_SYS_RESOURCE を持つプロセス)は、ソフトリミットとハードリミットを自由に変更することができます。

戻り値

以下は、戻り値についてです。

戻り値
int 成功 0
int エラー -1
スポンサーリンク

プログラム

以下は、プロセスがオープンできるファイルディスクリプタ数の上限を取得するプログラム、test_getrlimit.c です。

// include
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/resource.h>

// main
int main(void)
{
	int ret;
	
	struct rlimit rlim;
	
	// プロセスがオープン可能な
	// ファイルディスクリプタ数の上限を取得
	ret = getrlimit(RLIMIT_NOFILE, &rlim);
	if (ret == -1) {
		perror("getrlimit");
		exit(EXIT_FAILURE);
	}
	
	// ソフトリミット
	if (rlim.rlim_cur == RLIM_INFINITY) {
		printf("soft limit: RLIM_INFINITY\n");
	}
	else {
		printf("soft limit: %ld\n", rlim.rlim_cur);
	}
	
	// ハードリミット
	if (rlim.rlim_max == RLIM_INFINITY) {
		printf("soft limit: RLIM_INFINITY\n");
	}
	else {
		printf("hard limit: %ld\n", rlim.rlim_max);
	}
	
	return 0;
}
スポンサーリンク

実行結果

以下は、プログラム test_getrlimit.c を実行しています。

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra test_getrlimit.c -o test_getrlimit
***@ubuntu:~/***/test/c$ ./test_getrlimit
soft limit: 1024
hard limit: 4096

上記に示した通り、プロセスがオープンできるファイルディスクリプタ数の上限を取得することができました。

タイトルとURLをコピーしました