Existem no Solaris x86-64 alguns arquivos muito grandes, cujo tamanho excede 2 63 , ou seja, o tamanho máximo representável em um off64_t
. Isso inclui o arquivo que representa o espaço de endereço de um processo em proc
( /proc/<pid>/as
).
Para lidar com esses arquivos:
- Não use
fopen
,fseek
, etc. Não confie nas rotinas de fluxo libc, que (nas versões do Solaris que testei) manipulam mal os deslocamentos "ilegais". - Use
open64
,read
. -
Para procurar:
static off64_t lseeku64(int file, uint64_t offset /* eg from pr_argv */) { #ifndef __sun if (offset > 0x7FFFFFFFFFFFFFFFllu) return -1; #endif return lseek64(file, offset, SEEK_SET); }
Ou seja, no Solaris, sabemos que podemos fazer esse lançamento por causa da inspeção das fontes do OpenSolaris, mas devemos evitar que ele funcione em outras plataformas com
psinfo
epr_argv
(por exemplo, AIX).Mas, passe no seu offset muito grande e ele faz tudo "apenas funcione".