加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

尝试打开非常大的文件时,使用open命令出错

发布时间:2020-12-16 01:52:09 所属栏目:安全 来源:网络整理
导读:我正在学校上网,并且是第一次使用C / GDB.我们的任务是创建一个与客户端浏览器通信的Web服务器.我正在进行中,可以打开文件并将其发送给客户端.一切都很顺利,直到我打开一个非常大的文件,然后我就错了.我不是C / GDB的专业人员,所以我很抱歉,如果这导致我提出
我正在学校上网,并且是第一次使用C / GDB.我们的任务是创建一个与客户端浏览器通信的Web服务器.我正在进行中,可以打开文件并将其发送给客户端.一切都很顺利,直到我打开一个非常大的文件,然后我就错了.我不是C / GDB的专业人员,所以我很抱歉,如果这导致我提出愚蠢的问题而不能自己看到解决方案,但当我看到倾销的核心时,我看到我的seg故障来到这里:

if (-1 == (openfd = open(path,O_RDONLY)))

具体来说,我们的任务是打开文件并将其发送到客户端浏览器.我的算法是:

>打开/错误捕获
>将文件读入缓冲区/错误捕获
>发送文件

我们的任务还包括确保在发送非常大的文件时服务器不会崩溃.但我的问题似乎是打开它们.我可以发送所有较小的文件.有问题的文件是29.5MB.

整个算法是:

ssize_t send_file(int conn,char *path,int len,int blksize,char *mime) {
  int openfd; // File descriptor for file we open at path
  int temp; // Counter for the size of the file that we send
  char buffer[len]; // Buffer to read the file we are opening that is len big

  // Open the file
  if (-1 == (openfd = open(path,O_RDONLY))) {
    send_head(conn,"",400,strlen(ERROR_400));
    (void) send(conn,ERROR_400,strlen(ERROR_400),0);
    logwrite(stdout,CANT_OPEN);
    return -1;
  }

  // Read from file
  if (-1 == read(openfd,buffer,len)) {
    send_head(conn,CANT_OPEN);
    return -1;
  }
  (void) close(openfd);

  // Send the buffer now
  logwrite(stdout,SUC_REQ);
  send_head(conn,mime,200,len);      
  send(conn,&buffer[0],len,0);
  return len;
}

我不知道如果这只是一个事实,我是Unix / C新手.对不起,如果是的话. =(但你非常感谢你的帮助.

解决方法

可能尝试使用malloc分配内存,而不是使用可变长度数组.

char *buffer = malloc (len);

...

free (buffer);

我刚刚对我的系统进行了一些简单的测试,当我使用大尺寸的可变长度数组(就像你遇到麻烦的那样)时,我也得到了一个SEGFAULT.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读