Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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
可以从shell提示符执行“pread(fd,buf,size,offset)”的等效操作吗?_Shell_Unix_Sh - Fatal编程技术网

可以从shell提示符执行“pread(fd,buf,size,offset)”的等效操作吗?

可以从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偏移量可被大小整除时。不幸的是,这对于我的用例来

我想通过以下方式实现我在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偏移量
可被
大小
整除时。不幸的是,这对于我的用例来说是不够的

我试图读取的设备以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如何访问设备,但对于文件,您可以使用任何东西