Как я могу определить максимальное значение pid_t?

Обновить

December 2018

Просмотры

3.3k раз

6

Как я могу переносимым определить максимальное значение pid_tтипа? Там нет постоянной PID_MAX на моей системе.

(Обратите внимание, я имею в виду максимальное значение , разрешенное типа данных, а не де - факто максимальное значение система присвоит процессам.)

Пример использования: Я преобразования , предоставленный пользователем строки спецификации ФИД к pid_t, и вы хотите , чтобы убедиться , что ввод пользователя не превышает способность типа.

4 ответы

0

В одном из заголовков:

#ifndef PID_MAX
#define PID_MAX INT_MAX // or whatever value you see fit
#endif

Вы также можете сделать это на основе сервера / OS зависимого определения на основе переменных окружения.

Смотрите: Похожие записи: Максимальная PID в Linux

2

POSIX (2008) говорит :

blksize_t, pid_t и ssize_t должны быть подписаны целочисленные типы.

А также:

Реализация должна поддерживать один или несколько сред программирования, в котором ширина blksize_t, pid_t, size_t, ssize_t и suseconds_t не больше, чем ширина типа длинного.

Таким образом , вы можете конвертировать строки пользовательских , longа затем проверить на переполнение для типа pid_t использования long pid; .. pid == (pid_t)pid.

jfs
1

Ответ Стивен хороший подход.

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

#include <sys/types.h>
#include <limits.h>
#include <stdlib.h>

static inline pid_t get_max_pid_t()
{
    if (sizeof(pid_t) == sizeof(short)) return SHRT_MAX;
    if (sizeof(pid_t) == sizeof(int)) return INT_MAX;
    if (sizeof(pid_t) == sizeof(long)) return LONG_MAX;
#if defined(LLONG_MAX)  // C99
    if (sizeof(pid_t) == sizeof(long long)) return LLONG_MAX;
#endif
    abort();
}

POSIX гарантирует , что pid_tявляется подписанным интегральным типом. Этот код предполагает , что размер знакового интегрального типа однозначно определяет , что тип. Я думаю , что это отличное предположение, но я не уверен , гарантирует ли стандарт его.

Любой приличный компилятор будет встраивать и постоянной распространяются все это в небытие, так что производительность не является проблемой.

( За исключением: В C ++ можно было бы написать std::numeric_limits<pid_t>::max()и сделать с ней.)

6

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

Например, говорят, что вы использовали int64_t вместо этого, то вы могли бы иметь что-то вроде:

int64_t my_pid64;

/* ... parse string value into my_pid64 ... */

pid_t my_pid = (pid_t) my_pid64;
if ((int64_t) my_pid != my_pid64) /* check that value was not out of range of pid_t */
{
   /* ... handle error ... */
}

Там нет большого выбора для большего типа данных для использования. «Длинные» Раньше наибольший тип данных примитивным целое, но это не так на некоторых общих компиляторов / архитектур больше - даже для Linux (см комментарии ниже). Между тем, intmax_t типа имеет плохую поддержку библиотеки. Результатом является то, что int64_t иногда более полезны на практике.

Но, в основном ваши варианты для большего типа данных, вероятно, долго, int64_t и intmax_t.

Связанные вопросы