Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Чтение /proc/self/cmdline


Автор: Alca 15.3.2011, 12:52
Пытаюсь прочитать файл /proc/self/cmdline, но его размер равен 0, хотя файл не пуст, в нем есть данные.
Не понял юмора. Как тогда читать файл, не зная его размера?

Автор: Alca 15.3.2011, 13:21
Почему размер нулевой?

Автор: bsa 15.3.2011, 15:49
потому что содержимое файла создается в момент чтения.

Автор: Alca 15.3.2011, 16:54
  а можно как то узнать размер данных?

Автор: svlary 16.3.2011, 06:20
Цитата(Alca @  15.3.2011,  16:54 Найти цитируемый пост)
а можно как то узнать размер данных? 

  Зачем ?  Что бы выполнить системный вызов read(...) ?  Надо просто выделить буфер размера, заведомо большего, чем размер командной строки и читать в него :

Код

char cmd_buf[4096];
ssize_t rc;
. . . 
rc = read (fd, cmd_buf, 4095);

И в переменной rc будет реальное значение длины командной строки.  

Автор: Alca 16.3.2011, 10:26
Цитата

Надо просто выделить буфер размера, заведомо большего, чем размер командной строки и читать в него 

А что макс. размер коммандной строки это константа?

Автор: MAKCim 16.3.2011, 12:51
Цитата(Alca @  16.3.2011,  10:26 Найти цитируемый пост)
А что макс. размер коммандной строки это константа? 

в цикле читай пока read() не возвратит 0

Автор: Alca 16.3.2011, 14:38
Спасибо

Автор: svlary 17.3.2011, 05:59
Цитата(Alca @  16.3.2011,  10:26 Найти цитируемый пост)
макс. размер коммандной строки это константа? 

МАКСИМАЛЬНЫЙ оразмер, разумеется - константа. И можно даже эту константу найти где-то в исходных кодах bash...

Автор: Alca 17.3.2011, 10:24
Код

#include <unistd.h>
...
printf("%ld\n", sysconf(_SC_ARG_MAX));


Добавлено @ 10:26
Цитата

       ARG_MAX - _SC_ARG_MAX
              The maximum length of the arguments to the exec(3) family of functions.
              Must not be less than _POSIX_ARG_MAX (4096).


Цитата

BUGS         top
       It is difficult to use ARG_MAX because it is not specified how much of the
       argument space for exec(3) is consumed by the user's environment variables.

       Some returned values may be huge; they are not suitable for allocating memory.


Добавлено через 9 минут и 40 секунд
Цитата

getconf ARG_MAX
2 097 152 (bytes)

Чего-то мне влом выделять стока памяти

Автор: bsa 17.3.2011, 15:48
Зачем усложнять себе жизнь? Читаешь с помощью read() в буфер, при заполнении буфера увеличиваешь его размер в 2 раза (realloc()), дочитываешь...

Добавлено через 1 минуту и 30 секунд
А потом, в *nix существуют еще файлы устройств. Таких, как например последовательный порт. И как можно определить объем данных, передаваемых через него? Никак. Поэтому и нет функции GetFileSize() smile

Автор: Alca 17.3.2011, 18:05
ясно

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)