我需要将以下结构写入fifo:
struct msg_t {
int length;
char* msg;
};
我在其中malloc结构和char *,我这样写: (我们假设msg是变量名) write(fifo_fd,& msg,sizeof(msg_t));
从另一端读取长度就好了。 字符串不是.. 如何通过一次写入来编写这两个字段? 如果没有,两个单独的写入是否良好?
谢谢。
答案 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;
}
}