【问题标题】:is it essential to copy a returned struct from kernel space to user space?是否必须将返回的结构从内核空间复制到用户空间?
【发布时间】:2012-03-06 12:09:21
【问题描述】:

如果我进行系统调用,请说

struct hostent * gethostbyaddr (const char *addr, int len, int family );

它返回一个struct*,我是否需要将结构复制到我“拥有”的某个地方而不是直接使用指针?

【问题讨论】:

  • 一个典型的实现返回一个指向线程本地存储的指针。如果您进行任何其他调用,那么您最好进行深层复制。如果您使用线程并且不确定是否使用 TLS,那么您最好使用锁。
  • gethostbyaddr 不是系统调用,而是库例程。即使是系统调用,也不会返回指向内核空间的指针。

标签: c struct copy system-calls


【解决方案1】:

gethostbyaddrreads 的文档(见注释部分):

函数 gethostbyname() 和 gethostbyaddr() 可以返回指针 静态数据,可能会被以后的调用覆盖。复制 struct hostent 是不够的,因为它包含指针;一个深 副本是必需的。

这意味着如果你想确保它不会被后续对gethostbyaddr的调用覆盖,则需要复制该结构。

但您确实需要考虑使用getaddrinfo,因为gethostbyaddr 已过时。使用getaddrinfo,您不会问这个问题,因为您需要自己为结果分配内存。

【讨论】:

  • Copying the struct hostent does not suffice - 这不是说你不能复制返回的结构吗? getaddrinfo 是正确的建议。
  • @ugoren:这意味着你不能使用浅拷贝,因为结构包含指向另一个结构的指针,所以你必须使用深拷贝。
  • 深拷贝不是一个非常明确的操作。这取决于您要复制的结构。当你写“复制结构”时,我认为它意味着一个浅拷贝。
  • @ugoren:我自己没有写任何关于复制结构的东西,我只是引用了文档,文档明确说 deep 需要复制。
  • 引用:“这意味着你需要复制结构”。
【解决方案2】:

不,您可以直接使用指针。

(想一想:如果内存不可访问或访问不安全,您将无法复制它;反之,如果您能够复制它,您也可以就地使用它。

【讨论】:

  • 但是操作系统如何知道何时清除此内存?我担心当我从那个内存中读取时,操作系统会刷新它......
  • @can.:操作系统仅在您的进程退出时才会触及内存。 gethostbyaddr 返回的指针不是指向内核空间的指针。
  • 这因功能和操作系统而异。在我的 BSD 中,gethostbyaddr 使用线程本地存储,并声明内存只会被此线程上的后续调用覆盖。在其他实现中,gethostbyaddr 可能会返回指向静态数据的线程不安全指针。其他函数的行为可能不同(例如,要求您释放内存)——您应该阅读每个函数的文档。
猜你喜欢
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
  • 2016-05-17
  • 1970-01-01
  • 1970-01-01
  • 2011-10-22
  • 2014-08-02
  • 1970-01-01
相关资源
最近更新 更多