我在学校上网络课,第一次使用 C/GDB。我们的任务是制作一个与客户端浏览器通信的网络服务器。我进展顺利,可以打开文件并将它们发送给客户。一切都很顺利,直到我打开一个非常大的文件然后我出现了错误。我不是 C/GDB 的专业人士,所以如果这导致我提出愚蠢的问题并且我自己看不到解决方案,我很抱歉,但是当我查看转储的核心时,我发现我的段错误出现在这里:
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 新手的事实。对不起,如果是的话。 =( 但非常感谢您的帮助。
最佳答案
我可能只是误解了你在问题中的意思,但我觉得我应该指出,一般来说,尝试一次读取整个文件是个坏主意,以防你处理的事情只是太大了,你的内存无法处理。
分配一个特定大小的缓冲区更聪明,比如 8192 字节(好吧,无论如何,这就是我经常做的事情),并且总是读取和发送那么多,尽可能多,直到你读( ) 操作为流结束返回 0(并且没有设置错误号)。
关于c - 尝试打开非常大的文件时打开命令出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2069301/