将多个字段(struct)写入fifo

时间:2013-12-23 07:08:35

标签: c linux struct fifo

我需要将以下结构写入fifo:

struct msg_t {
   int length;
   char* msg;
};

我在其中malloc结构和char *,我这样写: (我们假设msg是变量名) write(fifo_fd,& msg,sizeof(msg_t));

从另一端读取长度就好了。 字符串不是.. 如何通过一次写入来编写这两个字段? 如果没有,两个单独的写入是否良好?

谢谢。

2 个答案:

答案 0 :(得分:2)

你只需要写长度和指针地址,我怀疑你在另一端会想要什么。我的猜测是你真正想要的是这样的:

struct msg_t msg;
// Initialise msg
write( fifo_fd, &(msg.length), sizeof(int) );
write( fifo_fd, msg.msg, msg.length );

答案 1 :(得分:1)

您是否考虑过使用flexible array members(也解释为here)?见this ......所以声明

struct msg_t {
    unsigned length;
    char msg[];
};

用例如

分配
struct msg_t* make_msg(unsigned l) {
  // one extra byte for the terminating null char
  struct msg_t* m = malloc(sizeof(struct msg_t)+l+1; 
  if (!m) { perror("malloc m"); exit(EXIT_FAILURE); };
  memset(m, 0, sizeof(struct msg_t)+l+1);
  m->length = l;
  return m;
}
然后用例如

写下来
fwrite(m, sizeof(struct msg_t)+m->length+1, 1, fil);

或者如果你使用write自己做缓冲(因为write可能是部分的!)例如。

void write_msg(int fd, struct msg_t *m) {
   assert(m != NULL);
   char* b = m;
   unsigned siz = sizeof(struct msg_t)+m->length+1);
   while (siz>0) {
      int cnt=write (fd, b, siz);
      if (cnt<0) { perror("write"); exit(EXIT_FAILURE); };
      b += cnt;
      siz -= cnt;
   }
}