Как добавить pid_t к строке в c - PullRequest
1 голос
/ 29 сентября 2011

Я опытный в Java, но я очень новичок в C. Я пишу это на Ubuntu.Скажем, у меня есть:

char *msg1[1028];
pid_t cpid;
cpid = fork();

msg1[1] = " is the child's process id.";

Как я могу объединить msg1 [1] таким образом, чтобы при вызове:

printf("Message: %s", msg1[1]);

идентификатор процесса будет отображаться перед "isидентификатор дочернего процесса. "?

Я хочу сохранить всю строку в msg1[1].Моя конечная цель - не просто напечатать ее.

1 Ответ

4 голосов
/ 29 сентября 2011

Простое решение:

printf("Message: %jd is the child's process id.", (intmax_t)cpid);

Не очень простое, но и не слишком сложное решение: используйте функцию (непереносную) asprintf:

asprintf(&msg[1], "%jd is the child's process id.", (intmax_t)cpid);
// check if msg[1] is not NULL, handle error if it is

Если на вашей платформе нет asprintf, вы можете использовать snprintf:

const size_t MSGLEN = sizeof(" is the child's process id.") + 10; // arbitrary
msg[1] = malloc(MSGLEN);
// handle error if msg[1] == NULL
if (snprintf(msg[1], MSGLEN, "%jd is the child's process id.", (intmax_t)cpid)
  > MSGLEN)
    // not enough space to hold the PID; unlikely, but possible,
    // so handle the error

или определить asprintf в терминах snprintf. Это не очень сложно, но вы должны понимать varargs. asprintf очень полезно иметь, и это должно было быть в стандартной библиотеке C давным-давно.

EDIT : Первоначально я рекомендовал приведение к long, но это не правильно, поскольку POSIX не гарантирует, что значение pid_t соответствует long. Вместо этого используйте intmax_t (включите <stdint.h>, чтобы получить доступ к этому типу).

...