Какова максимально возможная длина PID процесса? (64 бит)

#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. Конечно, вам может потребоваться включить пробел для завершающего нулевого символа, но приведенное выше должно дать вам количество символов, необходимое для представления значения в виде строки.