【发布时间】:2010-01-15 03:29:08
【问题描述】:
我正在学校参加网络课程,并且是第一次使用 C/GDB。我们的任务是创建一个与客户端浏览器通信的网络服务器。我正在进行中,可以打开文件并将它们发送给客户。一切都很好,直到我打开一个非常大的文件然后我出现了故障。我不是 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, "", 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 新手是否只是一个事实。对不起,如果是的话。 =(但非常感谢您的帮助。
【问题讨论】:
-
围绕它显示一些代码。更好的是,编写一个显示该问题的最小程序。
-
只要
path是指向可读内存中以 NUL 结尾的字符串的第一个字符的指针,我就无法想象该行有段错误。 (在许多情况下,open更有可能返回 -1 并设置errno=EFAULT。)您确定那是故障线吗? -
可能不是。我还不知道如何使用 GDB 或 Unix 环境来解决这个问题。但是当我在 gdb webserver webserver.core 中输入它时,它显示 Program Terminated with signal 11, Segmentation fault。它是 if (-1 == (openfd = open(path, O_RDONLY)) 行。我想这就是原因
-
哦,亲爱的。
char buffer[len]-- 请不要在堆栈上分配巨大的数组(或巨大的任何东西)!
标签: c linux unix networking gdb