num_get::get
которая пытается проинтерпретировать данные из потока как число и останавливается как только у неё перестаёт получаться. Т.е. в твоём случае -- сразу. Если мы запускаем fallocate без изменения размера файла, то что выходит? Файл не уменьшается, просто обнуляем данные в его начале.
Мы же не можем дописывать данные в конец и удалять в начале одной командой.?
Fallocate с дыркой вообще делает непонятную для меня вещь.
$ dd of=sparse bs=1G count=0 seek=1024
0+0 records in
0+0 records out
0 bytes copied, 6.9401e-05 s, 0.0 kB/s
$ stat sparse
File: sparse
Size: 1099511627776 Blocks: 0 IO Block: 4096 regular file
Device: fe03h/65027d Inode: 22684238 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/jcmvbkbc) Gid: ( 1000/jcmvbkbc)
Access: 2019-08-18 15:42:04.772367087 -0700
Modify: 2019-08-18 15:42:04.776367113 -0700
Change: 2019-08-18 15:42:04.776367113 -0700
Birth: -
$ echo test >> sparse
$ tail -c 100 sparse | hexdump -Cv
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 74 |...............t|
00000060 65 73 74 0a |est.|
00000064
$ stat sparse
File: sparse
Size: 1099511627781 Blocks: 8 IO Block: 4096 regular file
Device: fe03h/65027d Inode: 22684238 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/jcmvbkbc) Gid: ( 1000/jcmvbkbc)
Access: 2019-08-18 15:43:25.668878335 -0700
Modify: 2019-08-18 15:43:14.808809836 -0700
Change: 2019-08-18 15:43:14.808809836 -0700
Birth: -
хочу услышать совет по отладке
malloc: Incorrect checksum for freed object
Я выделяю память, а указатель невалиден, пишет "возможно объект был изменён после удаления". Какое удаление? Вот он, объект, только что создан.
И тут я вспоминаю про функцию mlock(), с которой уже имел такие грабли лет почти 25 назад. Добавил - работает.
что противоречит тому, что файл уменьшился на удаленные с его начала несколько байт
загляните отладчиком в код функции new.
Dump of assembler code for function _Znwm:
0x00007ffff7ae6790 <+0>: push %rbx
=> 0x00007ffff7ae6791 <+1>: test %rdi,%rdi
0x00007ffff7ae6794 <+4>: mov %rdi,%rbx
0x00007ffff7ae6797 <+7>: mov $0x1,%eax
0x00007ffff7ae679c <+12>: cmove %rax,%rbx
0x00007ffff7ae67a0 <+16>: mov %rbx,%rdi
0x00007ffff7ae67a3 <+19>: callq 0x7ffff7adff10 <malloc@plt>
0x00007ffff7ae67a8 <+24>: test %rax,%rax
0x00007ffff7ae67ab <+27>: je 0x7ffff7ae67b0 <_Znwm+32>
0x00007ffff7ae67ad <+29>: pop %rbx
0x00007ffff7ae67ae <+30>: retq
0x00007ffff7ae67af <+31>: nop
0x00007ffff7ae67b0 <+32>: callq 0x7ffff7adff60 <_ZSt15get_new_handlerv@plt>
0x00007ffff7ae67b5 <+37>: test %rax,%rax
0x00007ffff7ae67b8 <+40>: je 0x7ffff7ae67be <_Znwm+46>
0x00007ffff7ae67ba <+42>: callq *%rax
0x00007ffff7ae67bc <+44>: jmp 0x7ffff7ae67a0 <_Znwm+16>
0x00007ffff7ae67be <+46>: mov $0x8,%edi
0x00007ffff7ae67c3 <+51>: callq 0x7ffff7ae0840 <__cxa_allocate_exception@plt>
0x00007ffff7ae67c8 <+56>: mov 0x2ebec1(%rip),%rdx # 0x7ffff7dd2690
0x00007ffff7ae67cf <+63>: mov 0x2eb9e2(%rip),%rsi # 0x7ffff7dd21b8
0x00007ffff7ae67d6 <+70>: mov %rax,%rdi
0x00007ffff7ae67d9 <+73>: add $0x10,%rdx
0x00007ffff7ae67dd <+77>: mov %rdx,(%rax)
0x00007ffff7ae67e0 <+80>: mov 0x2ec681(%rip),%rdx # 0x7ffff7dd2e68
0x00007ffff7ae67e7 <+87>: callq 0x7ffff7ae0db0 <__cxa_throw@plt>
End of assembler dump.
mlock() гарантирует, что выделенная память не будет спейджирована операционной системой, и указатель будет валидным во время выполнения программы.
Для человека опериующего термином "ярлык windows" символьная ссылка на каталог может оказаться лучше жёсткой ссылки.
К тому же жёсткую ссылку на каталог скорее всего создать не получится.