可以从shell提示符执行“pread(fd,buf,size,offset)”的等效操作吗?
我想通过以下方式实现我在C语言中所能做到的:可以从shell提示符执行“pread(fd,buf,size,offset)”的等效操作吗?,shell,unix,sh,Shell,Unix,Sh,我想通过以下方式实现我在C语言中所能做到的: pread(fdesc, tgtbuf, size, file_offset); 或两者的结合: lseek(fd, file_offset, SEEK_SET); read(fd, tgtbuf, size) 作为shell命令 对于某些尺寸/偏移,可以使用: dd if=file bs=size skip=$((file_offset/size)) count=1 这很有效。。。但仅当文件\u偏移量可被大小整除时。不幸的是,这对于我的用例来
pread(fdesc, tgtbuf, size, file_offset);
或两者的结合:
lseek(fd, file_offset, SEEK_SET);
read(fd, tgtbuf, size)
作为shell命令
对于某些尺寸/偏移,可以使用:
dd if=file bs=size skip=$((file_offset/size)) count=1
这很有效。。。但仅当文件\u偏移量
可被大小
整除时。不幸的是,这对于我的用例来说是不够的
我试图读取的设备以8字节为单位“阻塞”了read
,但允许(需要)字节偏移量进行seek
dd
总是以bs
/ibs
为单位进行读取,但也总是以这些单位进行查找,这在我的情况下是相互排斥的。我知道我可以通过perl/python/C/…-但是有没有一种方法可以通过一个简单的shell脚本来实现呢 编辑:因为建议在此处使用
dd bs=1 count=8…
不,这不起作用strace
it,您将看到它:
$ strace -e lseek,read dd if=/dev/zero bs=1 skip=1234 count=8
[ ... ]
lseek(0, 1234, SEEK_CUR) = 0
read(0, "\0", 1) = 1
read(0, "\0", 1) = 1
read(0, "\0", 1) = 1
read(0, "\0", 1) = 1
read(0, "\0", 1) = 1
read(0, "\0", 1) = 1
read(0, "\0", 1) = 1
read(0, "\0", 1) = 1
这不是我需要的-它必须是单个read()
Edit2:
我试图读取的设备(/dev/cpu//msr
)很奇怪,因为偏移量被视为一个索引号
,但您必须始终读取驱动程序在读取时给出的EINVAL
但是每个索引返回不同的8字节值,因此您无法通过读取x
和x+8
并提取字节来“重建”从偏移量x+1
读取的数据。这是非常不寻常的。。。但这是/dev/cpu//msr
在Linux中的工作方式。bs=size:size可以是1个字节或更多。。。(这是对dd如何访问设备的指示,但是对于一个文件,你可以使用你需要的任何东西。不过,通常更有效地读取较大大小的块)
尝试:
如果(与您在问题中的陈述相反),您只能寻求8的倍数(并从中读取8字节):
(正如我在评论中所说,我真的很难想象一个设备,它允许你在任何地方搜索,并强制你从任何地方读取8字节,如果anywhere不是8的倍数…但是,嘿,任何事情都是可能的^^如果是这样,恐怕你需要另一个工具而不是dd)
如果真的很奇怪:在你需要的地址周围提取2个8字节的块,然后从中提取你需要的确切部分:
blockoffset=$(($address/8))
blockstart=$(($blockoffset*8))
shift=$(($address - $blockstart))
if [ "$shift" -eq 0 ]
dd if=file bs=8 skip=$blockoffset count=1 > final
else
dd if=file bs=8 skip=$blockoffset count=2 > bigger #we read 2 blocks from blockoffset
dd if=bigger bs=1 skip=$shift count=8 > final
fi
bs=大小:大小可以是1字节或更多。。。(这是对dd如何访问设备的指示,但是对于一个文件,你可以使用你需要的任何东西。不过,通常更有效地读取较大大小的块)
尝试:
如果(与您在问题中的陈述相反),您只能寻求8的倍数(并从中读取8字节):
(正如我在评论中所说,我真的很难想象一个设备,它允许你在任何地方搜索,并强制你从任何地方读取8字节,如果anywhere不是8的倍数…但是,嘿,任何事情都是可能的^^如果是这样,恐怕你需要另一个工具而不是dd)
如果真的很奇怪:在你需要的地址周围提取2个8字节的块,然后从中提取你需要的确切部分:
blockoffset=$(($address/8))
blockstart=$(($blockoffset*8))
shift=$(($address - $blockstart))
if [ "$shift" -eq 0 ]
dd if=file bs=8 skip=$blockoffset count=1 > final
else
dd if=file bs=8 skip=$blockoffset count=2 > bigger #we read 2 blocks from blockoffset
dd if=bigger bs=1 skip=$shift count=8 > final
fi
bs=大小:大小可以是1字节或更多。。。(这是对dd如何访问设备的指示,但是对于一个文件,你可以使用你需要的任何东西。不过,通常更有效地读取较大大小的块)
尝试:
如果(与您在问题中的陈述相反),您只能寻求8的倍数(并从中读取8字节):
(正如我在评论中所说,我真的很难想象一个设备,它允许你在任何地方搜索,并强制你从任何地方读取8字节,如果anywhere不是8的倍数…但是,嘿,任何事情都是可能的^^如果是这样,恐怕你需要另一个工具而不是dd)
如果真的很奇怪:在你需要的地址周围提取2个8字节的块,然后从中提取你需要的确切部分:
blockoffset=$(($address/8))
blockstart=$(($blockoffset*8))
shift=$(($address - $blockstart))
if [ "$shift" -eq 0 ]
dd if=file bs=8 skip=$blockoffset count=1 > final
else
dd if=file bs=8 skip=$blockoffset count=2 > bigger #we read 2 blocks from blockoffset
dd if=bigger bs=1 skip=$shift count=8 > final
fi
bs=大小:大小可以是1字节或更多。。。(这是对dd如何访问设备的指示,但是对于一个文件,你可以使用你需要的任何东西。不过,通常更有效地读取较大大小的块)
尝试:
如果(与您在问题中的陈述相反),您只能寻求8的倍数(并从中读取8字节):
(正如我在评论中所说,我真的很难想象一个设备,它允许你在任何地方搜索,并强制你从任何地方读取8字节,如果anywhere不是8的倍数…但是,嘿,任何事情都是可能的^^如果是这样,恐怕你需要另一个工具而不是dd)
如果真的很奇怪:在你需要的地址周围提取2个8字节的块,然后从中提取你需要的确切部分:
blockoffset=$(($address/8))
blockstart=$(($blockoffset*8))
shift=$(($address - $blockstart))
if [ "$shift" -eq 0 ]
dd if=file bs=8 skip=$blockoffset count=1 > final
else
dd if=file bs=8 skip=$blockoffset count=2 > bigger #we read 2 blocks from blockoffset
dd if=bigger bs=1 skip=$shift count=8 > final
fi
考虑到您已经遇到了很多麻烦,只需将C代码放入一个可执行程序中即可。或者雄心勃勃地将程序变成带有“enable-f pread.so pread”的bash扩展
可能有点过头了。一个单独的程序更容易。考虑到您已经遇到了很多麻烦,只需将C代码放入一个可执行程序中即可。或者雄心勃勃地将程序变成带有“enable-f pread.so pread”的bash扩展
可能有点过头了。一个单独的程序更容易。考虑到您已经遇到了很多麻烦,只需将C代码放入一个可执行程序中即可。或者雄心勃勃地将程序变成带有“enable-f pread.so pread”的bash扩展
可能有点过头了。一个单独的程序更容易。考虑到您已经遇到了很多麻烦,只需将C代码放入一个可执行程序中即可。或者雄心勃勃地将程序变成带有“enable-f pread.so pread”的bash扩展
可能有点过头了。单独的程序更容易。bs=size:size可以是1个字节或更多。。。(它指示dd如何访问设备,但对于文件,您可以使用任何东西