#c
#c
Вопрос:
Я работал над AIX и вижу, что некоторые запущенные идентификаторы процессов имеют длину 8….
Я использую PID в качестве конкатенации с другим значением char * и пытаюсь вычислить, какова эта МАКСИМАЛЬНО возможная длина PID, если бы вы смотрели на это с «точки зрения символов»?
Я посмотрел на структуру pid_t (например t.html «>http://dvbstreamer.sourceforge.net/api/structPID_t.html ) и он имеет PID в виде INT…
На этой заметке я предполагаю, что PID — это «подписанный int» …. в таком случае, какова максимальная длина подписанного int?
Спасибо за помощь
Линтон
Комментарии:
1. «8 long» — 8 какой длины? Вы говорите о длине строки, представляющей значение PID в десятичной системе счисления (например, 8374 состоит из 4 цифр)? И не предполагайте, что PID — это подписанный int; это
pid_t
, который может быть или не быть typedef дляsigned int
.2. Привет, ага… Я имел в виду строковое представление PID …thnx
Ответ №1:
Размер в байтах зависит от системы и должен просто запрашиваться следующим образом:
unsigned int pidLength = sizeof(pid_t);
Редактировать: Если вас беспокоит десятичное представление длины, как в printf("%d", myPID);
, я предлагаю запросить и это. Например, snprintf
функция возвращает количество символов (без нулевого завершения), которое она записала бы, если бы было достаточно места. Таким образом, вы можете сделать:
char tmpChar;
int representationLength = snprintf(amp;tmpChar, 1, "%d", myPID);
if (representationLength == -1) { handle_error(); }
char *finalString = malloc(representationLength 1);
snprintf(finalString, representationLength 1, "%d", myPID);
Возможно, snprintf(NULL, 0, "%d", myPID)
также сработало бы запросить длину, но на snprintf
справочной странице Linux написано следующее:
Что касается возвращаемого значения snprintf(), SUSv2 и C99 противоречат друг другу: когда snprintf() вызывается с size = 0, то SUSv2 указывает неопределенное возвращаемое значение, меньшее 1, в то время как C99 допускает, что str в этом случае равен НУЛЮ, и выдает возвращаемое значение (как всегда) как количество символов, которые были бы записаны в случае, если выходная строка была достаточно большой.
Комментарии:
1. «PID как объединение с другим значением char*»… он хочет максимальную длину, если преобразует PID в строку.
2. Да, прочитав ваш ответ, я был немного сбит с толку и перечитал вопрос. Отредактировал свой ответ.
Ответ №2:
Максимальное количество цифр в 32-разрядном int равно 10.
Максимальное количество цифр в 64-разрядном int со знаком равно 19.
Максимальное количество цифр в 64-разрядном беззнаковом int равно 20.
Я не знаю, использует ли AIX 32 или 64 бита, подписанные или беззнаковые, для своего pid_t
.
Редактировать: это должно быть подписано, потому что fork может возвращать -1.
Комментарии:
1. Мы также могли бы определить ~ ((pid_t) 0) как недопустимый PID и использовать неподписанный 64-битный тип в качестве pid_t … — Я имею в виду, на всякий случай, если нам понадобится так много процессов в нашей ОС 😉
Ответ №3:
Другим подходом могло бы быть использование (int)log10(pid) 1. Конечно, вам может потребоваться включить пробел для завершающего нулевого символа, но приведенное выше должно дать вам количество символов, необходимое для представления значения в виде строки.