Archivos de mayor tamaño que max (off64_t) en Solaris, p. Ej. "/proc/../as"

¿Cómo leo o busco desde un file que es más grande que el máximo off64_t? El problema surge porque el espacio de direcciones de un process se representa en el file /proc/.../as , que es un gran file disperso para processs de 64 bits. Es realmente muy grande: en un process de muestra en Solaris x86-64, la dirección de argv es 0xFFFFFD7FFFxxxxxx, es decir, se usa la parte superior del espacio de direcciones. Los pointers no están firmados, pero se ha firmado un off64_t, por lo que no se puede acceder a nada en la mitad superior del file de espacio de direcciones.

Esto obviamente depende del layout del espacio de direcciones. En sistemas de 32 bits, esto no es un problema (una compensación long no es lo suficientemente grande, pero una off64_t funciona fácilmente), y en x86-64 en Linux (por ejemplo), la parte superior del process es 0x7fffxxxxxxxx (48 bits), así que una vez off64_t puede referirse a cualquier cosa en el espacio de direcciones del process.

Por lo tanto, es una pena que Solaris en x86-64 parezca usar todo el espacio de direcciones de 64 bits, cuando 50 bits es más que suficiente. Los ejemplos de Sun de usar psinfo_t.pr_argv simplemente no parecen funcionar, excepto en SPARC y x86. ¿Hay alguna forma de evitar este problema?

Existen en Solaris x86-64 algunos files muy grandes, cuyo tamaño es superior a 2 63 , es decir, el tamaño máximo representable en off64_t . Esto incluye el file que representa el espacio de direcciones de un process en proc ( /proc/<pid>/as ).

Para tratar con estos files:

  1. No use fopen , fseek , etc. No confíe en las rutinas de secuencia de libc, que (en las versiones de Solaris I probadas) destruyen las compensaciones "ilegales".
  2. Use open64 , read .
  3. Buscar:

     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); } 

    Es decir, en Solaris, sabemos que podemos hacer este lanzamiento debido a la inspección de las fonts OpenSolaris, pero debemos evitar suponer que funciona en otras plataforms con psinfo y pr_argv (por ejemplo, AIX).

    Pero, pase su compensación muy grande, y todo "solo funciona".