c - 尝试打开非常大的文件时打开命令出现段错误

标签 c linux unix networking gdb

我在学校上网络课,第一次使用 C/GDB。我们的任务是制作一个与客户端浏览器通信的网络服务器。我进展顺利,可以打开文件并将它们发送给客户。一切都很顺利,直到我打开一个非常大的文件然后我出现了错误。我不是 C/GDB 的专业人士,所以如果这导致我提出愚蠢的问题并且我自己看不到解决方案,我很抱歉,但是当我查看转储的核心时,我发现我的段错误出现在这里:

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

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

  1. 打开/错误捕获
  2. 将文件读入缓冲区/错误捕获
  3. 发送文件

我们还负责确保服务器在发送非常大的文件时不会崩溃。但我的问题似乎在于打开它们。我可以很好地发送我所有的小文件。有问题的文件是 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, "", 400, strlen(ERROR_400));
    (void) send(conn, ERROR_400, strlen(ERROR_400), 0);
    logwrite(stdout, 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 新手的事实。对不起,如果是的话。 =( 但非常感谢您的帮助。

最佳答案

我可能只是误解了你在问题中的意思,但我觉得我应该指出,一般来说,尝试一次读取整个文件是个坏主意,以防你处理的事情只是太大了,你的内存无法处理。

分配一个特定大小的缓冲区更聪明,比如 8192 字节(好吧,无论如何,这就是我经常做的事情),并且总是读取和发送那么多,尽可能多,直到你读( ) 操作为流结束返回 0(并且没有设置错误号)。

关于c - 尝试打开非常大的文件时打开命令出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2069301/

相关文章:

c++ - C 中的多维数组

c - 这是什么意思?将 char* 转换为 unsigned int

ELF 执行期间的 Linux 内存/磁盘行为

linux - 内核线程与用户线程之间的上下文切换

C格式字符串漏洞: How many bytes does %x read from the stack?

c - 显示 printf() 的永久表\列表

c# - 单声道:运行时错误:v4.0.30319

c - 为什么 sigchld_handler 也会收到 SIGTSTP?

bash - 基于公共(public)字段(IP 地址)连接两个文本文件

Unix:在没有虚拟文件的情况下添加文件?