Ошибка сегментации: выделение стека в программе на C в Ubuntu, когда буфер> 4M
Вот'небольшая программа для колледжас задачей:
#include
#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;
}
Вместо этого есть альтернатива, использующая функции stdio.h fread и fwrite.
Что ж. Я скомпилировал обе эти версии программы с 25 различными значениями размера буфера: 1, 2, 4, ..., 2 ^ i с i = 0..30
Вот пример того, как я его скомпилирую: gcc -DBUFFERSIZE = 8388608 prog_sys.c -o bin / psys.8M
Вопрос: На моей машине (Ubuntu Precise 64, подробности в конце) все версии программы работают нормально: ./psys.1M < данные
(данные представляют собой небольшой файл с 3-строчным текстом ASCII.)
Проблема: Когда размер буфера составляет 8 МБ или больше. Обе версии (используя системный вызов или функции clib) аварийно завершают работу с этими размерами буфера (Ошибка сегментации).
Я проверял много вещей. Первая версия кода была такой: (...) main () {char buffer [BUFFERSIZE]; int i;
i = read(0, buffer, BUFFERSIZE);
(...)
Это вылетает, когда я вызываю функцию чтения. Но с этими версиями:
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);
Оба они вылетали (SEGFAULT) в первой строке main. Однако, если я переместу буфер из main в глобальную область (таким образом, выделение в куче вместо стека), это работает нормально:
char buffer[BUFFERSIZE]; //NOW GLOBAL AND WORKING FINE
main()
{
int j = BUFFERSIZE;
int i;
i = read(0, buffer, BUFFERSIZE);
Я использую Ubuntu Precise 12.04 64bit и Intel i5 M 480 1-го поколения.
#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
Я нене знаю ограничений ОС для стека. Есть ли способ разместить большие данные в стеке, даже если это не очень хорошая практика?