分段错误:当bufffer> 4M时,在Ubuntu中的C程序中进行堆栈分配

发布时间:2020-04-08 发布网站:大佬教程
大佬教程收集整理的这篇文章主要介绍了分段错误:当bufffer> 4M时,在Ubuntu中的C程序中进行堆栈分配大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
这是一个针对大学任务的小程序:
#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,i);
        i = read(0,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文本的小文件.) 问题是:当缓冲区大小为8MB或更大时.两个版本(使用系统调用或clib函数)都会使用这些缓冲区大小(Segmentation Fault)崩溃. 我测试了很多东西.代码的第一个版本是这样的:
(……)
主要()
{
char buffer [BUFFERSIZE];
int i;

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

当我调用read函数时,这会崩溃.但是对于这些版本:

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

    i = read(0,BUFFERSIZE);


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

    i = read(0,BUFFERSIZE);

它们都在主要的第一行崩溃(SEGFAULT).但是,如果我将缓冲区从main移动到全局范围(因此,在堆中而不是堆栈中分配),这可以正常工作:

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

    i = read(0,BUFFERSIZE);

我使用的是Ubuntu Precise 12.04 64位和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

我不知道有关堆栈的操作系统限制.有没有办法在堆栈中分配大数据,即使这不是一个好的实践?

解决方法

在Linux中,堆栈大小通常是有限的.命令ulimit -s将以Kbytes为单位给出当前值.您可以(通常)更改文件/etc/security/limits.conf中的默认值.您还可以根据权限,通过代码在每个进程的基础上更改它:
#include <sys/resource.h>
// ...
struct rlimit x;
if (getrlimit(RLIMIT_STACK,&x) < 0)
    perror("getrlimit");
x.rlim_cur = RLIM_INFINITY;
if (setrlimit(RLIMIT_STACK,&x) < 0)
    perror("setrlimit");

大佬总结

以上是大佬教程为你收集整理的分段错误:当bufffer> 4M时,在Ubuntu中的C程序中进行堆栈分配全部内容,希望文章能够帮你解决分段错误:当bufffer> 4M时,在Ubuntu中的C程序中进行堆栈分配所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ群:277859234,请注明来意。