我有一个与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

最佳答案

man page of writev开始:

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/

10-12 18:04