Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
IO#ioctl弄乱了一个论点?(Ruby 2.1.3)_Ruby_Ruby 2.1 - Fatal编程技术网

IO#ioctl弄乱了一个论点?(Ruby 2.1.3)

IO#ioctl弄乱了一个论点?(Ruby 2.1.3),ruby,ruby-2.1,Ruby,Ruby 2.1,第二个论点似乎通过了 require "socket" SIOCGIWESSID = 0x8B1B IW_ESSID_MAX_SIZE = 32 sock = Socket.new(Socket::AF_INET, Socket::SOCK_DGRAM, 0) template = "a16pI2" iwessid = [ 'wlan0', ' ' * IW_ESSID_MAX_SIZE, IW_ESSID_MAX_SIZE, 1 ].pack(template) iwessi

第二个论点似乎通过了

require "socket"

SIOCGIWESSID      = 0x8B1B
IW_ESSID_MAX_SIZE = 32

sock = Socket.new(Socket::AF_INET, Socket::SOCK_DGRAM, 0)
template = "a16pI2"
iwessid  = [ 'wlan0', ' ' * IW_ESSID_MAX_SIZE, IW_ESSID_MAX_SIZE, 1 ].pack(template)

iwessid_bak = iwessid.dup
p iwessid == iwessid_bak    # true

sock.ioctl(SIOCGIWESSID, iwessid)  # iwessid string changed after #ioctl

p iwessid == iwessid_bak    # false !
p iwessid, iwessid_bak      # iwessid is different, lot of zero chars \0x00
                            # appended to original content
这是一个预期的行为还是一个bug?
使用新的Ruby 2.1.3进行测试。

这是预期行为,否则您将如何获得感兴趣的数据

Ruby的
IO#ioctl
是一个相当薄的包装器,围绕着平台本身的
ioctl
系统调用。此系统调用(或其C包装器)接受整数选项和指向与该选项相关的数据结构(即结构)的指针,该结构包含内核内外的数据(对于某些选项,它还可以接受整数)。因此,您可以设置该结构,使用指向该结构的指针作为参数进行
ioctl
调用,然后检查其中的更改以获取所需的信息

Ruby允许您将此结构作为Ruby字符串传递,但它仍然需要采用系统调用所期望的格式,因此通常需要使用
pack
。之后可能需要在同一字符串上使用
解包
,以提取所需的数据

我对
SIOCGIFHWADDR
选项一无所知,但快速搜索会找到一个与您的示例相同(或类似)的示例。在调用
ioctl
后,代码继续:

interface, essid, len, flags = iwreq.unpack("a16pII")

虽然细节并不完全相同(解包格式略有不同,并且使用了不同的变量名),但它显示了您将如何获得您想要的结果。

谢谢您的回答。我只希望通过值传递给方法的参数保持不变(除非像数组元素那样间接)。复制应该在#ioctl内部执行,并检索数据和返回值作为方法的结果。考虑到Ruby非常不规范。“DavidUnric,我同意这是非常不寻常的红宝石,但是对于C代码来说是相当常见的。”code>IO#ioctl
似乎试图密切跟踪底层的
ioctl
。有些调用会在int返回值中返回有用的信息。据我所知,
ioctl
是相当低的级别和特定于平台的,即使在编写C时也是如此。我怀疑要获得一个类似Ruby的通用接口是很困难的。我认为你的回答是被接受的,因为你是对的,这是故意的<代码>IO#ioctl
方法的文档签名只返回一个整数(retcode),请求中没有结果数据,因此在哪里可以存储没有歧义。