LINUX.ORG.RU

Как окружение влияет на количество доступных файловых дескрипторов?

 ,


0

1

Из любопытства написал:

#include <cstdio>
using namespace std;

int main() {
	printf("start test fd\n");

	size_t counter = 0u;
	while(true)
	{
		if (char* file_name = tmpnam(NULL))
		{
			if (FILE* f = fopen(file_name, "wb"))
			{
				fwrite("hello", 5, 1, f);
				++counter;
			} else
			{
				break;
			}
		} else
		{
			break;
		}
	}

	printf("can open %ld files simultaneously\n", counter);

	return 0;
}

Запустил этот код напрямую из эклипса получил 4093 файловый дескриптора, запустил руками из консоли получил 1021, я так понимаю, что три стандартных файловых потока резервируются, но почему это не совпадает? Заранее благодарю, если кто подскажет, или где прочитать про такое.

Забыл указать, балуюсь на Ubuntu 13.04 64bit



Последнее исправление: leanid-chaika (всего исправлений: 1)

А ты всего по разу запустил?

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от AptGet

Скорее всего эклипс поднимает свой лимит на количество дескрипторов, как заметил AptGet, а твой процесс его наследует. man setrlimit. Кстати можно не плодить временные файлы, а открывать один и тот же, /dev/zero, например — дескрипторы все равно разные будут.

arturpub ★★
()
Ответ на: комментарий от arturpub

Дописал немного кода, для проверки, и все стало на свои места. Благодарю. Кстати физически файлы не создаются, и это нормально, ведь я не вывожу их принудительно и не закрываю потоки. Если кому интересно код:

#include <cstdio>
#include <cstdlib>

#include <sys/resource.h>
using namespace std;

int main() {
	printf("start test fd\n");
	rlimit limit;
	if (-1 == getrlimit(RLIMIT_NOFILE, &limit))
	{
		printf("can't get RLIMIT_NOFILE");
		exit(EXIT_FAILURE);
	}
	printf("system limit on file descriptors is: soft %ld hard %ld\n",
			limit.rlim_cur, limit.rlim_max);

	size_t counter = 0u;
	while(true)
	{
		if (char* file_name = tmpnam(NULL))
		{
			if (FILE* f = fopen(file_name, "wb"))
			{
				fwrite("hello", 5, 1, f);
				++counter;
			} else
			{
				break;
			}
		} else
		{
			break;
		}
	}

	printf("can open %ld files simultaneously\n", counter);

	return 0;
}

leanid-chaika
() автор топика
Ответ на: комментарий от leanid-chaika

Кстати физически файлы не создаются, и это нормально, ведь я не вывожу их принудительно и не закрываю потоки

Wat?

arturpub ★★
()
Ответ на: комментарий от arturpub

Я сильно ошибался, файлы создаются, и в них записано то что ожидается, путь к файлам /tmp/fileSdfkx выглядит примерно так, а я думал, что они будут создаваться в текущей рабочей директории. Видимо ос видит, что приложение закрылось, и сама закрывает все дескрипторы, и все сохраняет.

leanid-chaika
() автор топика
Ответ на: комментарий от leanid-chaika

Тебе надо покурить маны на предмет чем отличается open/read/write от fopen/fread/fwrite, а также что происходит при возврате из main(), и что есть main(), и все встанет на свои места :)

arturpub ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.