我有一个与USB交互的程序,我想知道下面的write命令告诉我什么。我知道writev iovec结构由数据数组指针和长度组成,但是数据数组中的"@\10\335 \320\2w\4\240K\252\0\7"
表示什么?我特别想知道@symbol、2w和240K是什么意思,因为它们不是我所期望的十六进制数据值。
我在Linux上运行,下面是writev行:
writev(6, [{"@\10\335 \320\2w\4\240K\252\0\7", 13}, {"\0\0\0\4\0\0\0\4", 8}], 2) = 21
最佳答案
ssize_t readv(int fd, const struct iovec *iov, int iovcnt);
也就是说,第二个参数是一个大小数组,即第三个参数(在您的例子中是
2
元素)类型的值。当
struct iovec
打印这些字符时,八进制转义不可打印的字符,但显示的所有其他字符与打印的完全相同。因此,strace
只是对应于@
的字节,@
是对应于K
的字节,以此类推。在评论中回答你的问题,再看看man page显示
struct iovec {
void *iov_base; /* Starting address */
size_t iov_len; /* Number of bytes to transfer */
};
这意味着
K
将被读取为{"@\10\335 \320\2w\4\240K\252\0\7", 13}
,iov_len = 13
是包含打印为iov_base
的字节的内存区域。如果要查看二进制值,请启动@\10\335 \320\2w\4\240K\252\0\7
:[mihai@winterfell 1]$ gdb -q
(gdb) p/x "@\10\335 \320\2w\4\240K\252\0\7"
$1 = {0x40, 0x8, 0xdd, 0x20, 0xd0, 0x2, 0x77, 0x4, 0xa0, 0x4b, 0xaa, 0x0, 0x7, 0x0}
其中最后一个
gdb
是字符串的空终止符,应忽略。关于c - 在Linux中具有writev()函数的Strace,数据中的“@”,“2w”和“240K”代表什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26615484/