Вы можете сделать это:
long l;
if (read(fd[0], &l, sizeof(l)) != sizeof(l))
{
/* TODO: handle this */
}
Если ваш тип сериализации равен long
, вы теряете здесь некоторую гибкость, поскольку вполне возможно, что тот, кто читает эти данные, получит другой порядок байтов илидругой размер для long
.В качестве примера представьте, что вы fork
и dup2(fd[1], 1)
t в итоге exec
получаете команду SSH в дочернем процессе ... Теперь данные потенциально поступают с другого компьютера, и будут проблемы.Чтобы избежать этого, вы можете сделать что-то вроде этого:
/* Type of l has a predictable size. */
uint32_t l;
if (read(fd[0], &l, sizeof(l)) != sizeof(l))
{
/* TODO: handle this */
}
/* Convert byte order of what we just read */
l = ntohl(l);
На самом деле это немного странно для read
с 32-битными приращениями ... Что вы должны рассмотреть, так это придумать формат сообщения ичитать большие куски данных за один раз.Хороший способ сделать это - для каждого количества информации иметь заголовок, который указывает размер последующего сообщения, тип сообщения и т. Д. Или, если вы не находите это привлекательным, вы можете рассмотреть вопрос о том, чтобы ваша сериализация была текстовой.Это также обеспечило бы достойный ответ на проблему с порядком байтов.