如何使用dd读写不同的块大小

时间:2017-03-29 11:35:22

标签: linux dd

我正在尝试使用dd将数据从文件传输到另一个文件。

由于我在循环中多次调用dd,我必须从输入文件中跳过一定数量的块然后开始复制。 但是,在最后一次迭代中,输出块大小可能与以前的大小不同,因此我需要将ibsobs个操作数设置为不同的值,并跳过第一个 N <输入文件中的/ em> ibs -sized 块。

我知道在dd 8.2中这可以通过设置iflag=skip_bytes操作数并指定要跳过的确切字节数而不是块数来完成,但是我在dd 8.4中没有该标志。使用。

因此,我尝试通过设置iflag=count_bytes选项和count等于要复制的字节数来实现此目的。

关于循环的正常迭代和最后一个循环的结果命令如下:

dd if=./ifile of=./ofile iflag=count_bytes ibs=512 obs=512 skip=0 count=512
...
dd if=./ifile of=./ofile iflag=count_bytes ibs=512 obs=256 skip=2 count=256

但dd在复制数据时挂起。如果我强制终止每次迭代,我从dd得到以下输出:

// ibs:512  obs:512 skip:0  count:512
^C1+0 records in
0+0 records out
0 bytes (0 B) copied, 9.25573 s, 0.0 kB/s

...

// ibs:512  obs:256 skip:2  count:256
^C0+1 records in
0+0 records out
0 bytes (0 B) copied, 5.20154 s, 0.0 kB/s

我错过了什么吗?

编辑:从以下C代码调用dd:

while (bytes_sent < tot_bytes){     
    unsigned int packet_size = (tot_bytes - bytes_sent < MAX_BLOCK_SIZE) ?
            (tot_bytes - bytes_sent) : MAX_BLOCK_SIZE;

    sprintf(cmd, "dd if=./ifile of=./ofile iflag=count_bytes ibs=%u obs=%u skip=%u count=%u",
            MAX_BLOCK_SIZE, packet_size, sent, packet_size);
    system(cmd);
    bytes_sent += packet_size;
    sent++;
}

提前感谢您的帮助!

0 个答案:

没有答案