【问题标题】:system call to populate struct values填充结构值的系统调用
【发布时间】:2014-09-21 14:33:48
【问题描述】:

我正在尝试使用系统调用填充 struct 值。我最初的努力如下。但是我从打印语句中得到垃圾值。

int fd;
int nbytes;
struct message {
  char *from;
  char *to;
  int size;
};
struct message m1={"me","you",10};
struct message m2;

fd=creat("structfile",0644);
nbytes=write(fd,&m1,sizeof(m1));
read(fd,&m2,nbytes);

printf("%s %s %d",m2.from,m2.to,m2.size);

还有其他方法可以做到这一点吗? (我正在考虑通过分别调用gethostbynamereaddir 来直接填充像hostentdirent 这样的结构)

【问题讨论】:

    标签: c pointers struct system-calls


    【解决方案1】:

    Problem 3,你的结构包含字符指针:

    struct message {
      char *from;
      char *to;
      int size;
    };
    

    您的sizeof(m1) 写入2 (char *) pointersan (int) 的大小。 fromto 指向的数据可能会因字符串的大小而异。读取sizeof(m1) 没有考虑指向的字符串的大小。

    【讨论】:

      【解决方案2】:

      问题一:

      fd 在哪里初始化?

      问题 2:

      线

      nbytes=write(fd,&m1,sizeof(m1));
      

      写出指针m1.fromm1.to 的数值。它不会写入它们指向的字符串。

      如果要写m1的内容,就得序列化m1.fromm1.to的内容。有为此目的的图书馆。你可以看到来自How to serialize data in C的一些参考资料。

      【讨论】:

      • 对不起。更正了 fd 初始化。
      • @user3818219, 除了write 用于struct message 类型的对象的问题之外,您还有fd 在写入后指向文件末尾的问题。 read 没有任何内容可供阅读。
      • @RSahu fd 并没有真正指向任何地方;这可能会使 C 新手感到困惑。它基本上是一个常量整数,它引用 opened 文件......你必须使用 lseek (或类似的)来告诉内核在 周围移动无缓冲 文件(文件描述符而不是 FILE*)... 传输字符串的最简单方法之一是 size:values 方法,例如 5hello5world 或 "string" write(fd,strlen(s),sizeof(size_t));write(fd,s,strlen(s));,然后是另一个end read(fd,len,sizeof(size_t));read(fd,string,len);... 注意:整数是字节序相关的
      • @technosaurus:other 传输字符串的简单方法是使用固定长度的字符串 - dirent 确实如此。这消除了为每个字符串分配和释放内存的需要。
      猜你喜欢
      • 2018-12-24
      • 2011-09-08
      • 1970-01-01
      • 2011-01-18
      • 2011-08-13
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      相关资源
      最近更新 更多