Преобразование pid_t в строку - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь преобразовать pid в строку. Я попробовал это так:

int pid = getpid(); //this int conversion should be ok as far as I know
char * mypid = (char *)malloc(sizeof(int));
sprintf(mypid, "%d", pid);

Я предполагаю, что моя ошибка, возможно, в том, что я не добавил NULL в конце. Я пытался сделать это, но все еще получал сообщения об ошибках. Может кто-нибудь объяснить мне, что является лучшим способом, кроме PID в символ * ("строка")? Спасибо !!

Ответы [ 4 ]

0 голосов
/ 09 ноября 2018

для преобразования pid в строку

malloc(sizeof(int) - это размер int, например 4 байта. Это не объем памяти для сохранения в виде десятичного текста в строке.


getpid() возвращает тип pid_t.

Учитывая, что pid_t подписано согласно IEEE (глубоко скрыто) и здесь , но с неизвестной шириной, разумно предположить, что оно не шире, чем intmax_t .

Назначение pid_t на int может привести к потере информации.

минимальное распределение

Позвольте asprintf() выделить и преобразовать в строку. ссылка

pid_t pid = getpid();
char *mypid = NULL;
if (asprintf(&mypid, "%jd", (intmax_t) pid) != -1) {
  // Success

  // use mypid somehow.

  free(mypid); // cleanup when done.
}
0 голосов
/ 09 ноября 2018

Массив символов mypid имеет неправильный размер.Вы используете sizeof(int), это количество байтов, необходимое для хранения целого числа в вашей системе, а не длина строки целого числа.Вы можете подсчитать количество цифр, если хотите быть точным, или выделить буфер достаточного размера, если точное хранение не имеет значения.

Правильно и безопасно будет:

const size_t max_pid_len = 12; // Could be system dependent.
int pid = getpid();
char * mypid = malloc(max_pid_len + 1);
snprintf(mypid, max_pid_len, "%d", pid);
0 голосов
/ 09 ноября 2018

sprintf отформатирует строку и добавит завершающий ноль для вас, если для этого достаточно места в буфере.

Ваша настоящая проблема заключается в следующем: sizeof(int) недостаточно для хранения строкового значениялюбое возможное целое число;это всего лишь длина int в байтах в вашей системе.Если int - это 32 бита в вашей системе, вам нужно выделить как минимум 12 байт для максимально длинного представления строки base-10 (-2147483648 плюс завершающий ноль).Если int равен 64 битам, вам нужно выделить 21 байт.

0 голосов
/ 09 ноября 2018

sizeof(int), скорее всего, 4 байта в вашей системе. Строка, содержащая PID, потребует (при условии 16-битного PID) не менее 6 байтов: 5 для десятичных цифр и 1 для нулевого терминатора. Таким образом, вы не выделяете достаточно места и потенциально пишете после конца выделенного массива. Это вызывает неопределенное поведение .

Убедитесь, что вы выделите достаточно места для рассматриваемой строки:

int pid = getpid();
char * mypid = malloc(6);   // ex. 34567
sprintf(mypid, "%d", pid);

Или используйте строку фиксированного размера:

int pid = getpid();
char mypid[6];   // ex. 34567
sprintf(mypid, "%d", pid);

Если ваша система поддерживает 32-разрядные идентификаторы PID, вам потребуется не менее 11 байтов. Для 64-битных PID не менее 21.

...