Fallo de segmentación: la asignación de la pila en un programa C en Ubuntu cuando está en búfer> 4M

Aquí hay un pequeño programa para la tarea de una universidad:

#include <unistd.h>

#ifndef BUFFERSIZE
#define BUFFERSIZE 1
#endif

main()
{
    char buffer[BUFFERSIZE];
    int i;
    int j = BUFFERSIZE;

    i = read(0, buffer, BUFFERSIZE);

    while (i>0)
    {
        write(1, buffer, i);
        i = read(0, buffer, BUFFERSIZE);
    }

    return 0;
}

Hay una alternativa utilizando las funciones stdio.h fread y fwrite en su lugar.

Bien. Compilé estas dos versiones del programa con 25 valores diferentes de tamaño de búfer: 1, 2, 4, ..., 2 ^ i con i = 0..30

Este es un ejemplo de cómo lo compilo: gcc -DBUFFERSIZE = 8388608 prog_sys.c -o bin / psys.8M

La pregunta: en mi máquina (Ubuntu Precise 64, más detalles al final) todas las versiones del programa funcionan bien: ./psys.1M <data

(Los datos son un archivo pequeño con 3 líneas de texto ASCII).

El problema es: cuando el tamaño del búfer es de 8 MB o más. Ambas versiones (utilizando las funciones de llamada del sistema o clib) se bloquean con estos tamaños de búfer (Fallo de segmentación).

He probado muchas cosas. La primera versión del código fue así: (...) main () {char buffer [BUFFERSIZE]; int i;

    i = read(0, buffer, BUFFERSIZE);
(...)

Esto se bloquea cuando llamo a la función de lectura. Pero con estas versiones:

main()
{
    char buffer[BUFFERSIZE]; // SEGMENTATION FAULT HERE
    int i;
    int j = BUFFERSIZE;

    i = read(0, buffer, BUFFERSIZE);


main()
{
    int j = BUFFERSIZE; // SEGMENTATION FAULT HERE
    char buffer[BUFFERSIZE];
    int i;

    i = read(0, buffer, BUFFERSIZE);

Ambos se estrellan (SEGFAULT) en la primera línea de principal. Sin embargo, si muevo el búfer fuera del ámbito principal al ámbito global (por lo tanto, la asignación en el montón en lugar de la pila), esto funciona bien:

char buffer[BUFFERSIZE]; //NOW GLOBAL AND WORKING FINE
main()
{
    int j = BUFFERSIZE;
    int i;

    i = read(0, buffer, BUFFERSIZE);

Utilizo Ubuntu Precise 12.04 64bits e Intel i5 M 480 de 1ª generación.

#uname -a
Linux hostname 3.2.0-34-generic #53-Ubuntu SMP Thu Nov 15 10:48:16 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

No sé las limitaciones del sistema operativo sobre la pila. ¿Hay alguna forma de asignar big data en la pila, incluso si esta no es una buena práctica?