gpt4 book ai didi

c - 在循环中打开文件时如何避免段错误?

转载 作者:太空宇宙 更新时间:2023-11-04 01:45:11 24 4
gpt4 key购买 nike

当尝试打开一个文件(由事件->名称定义)时,我一直遇到段错误(核心已转储)。我最接近防止这个问题的方法是将“rb”更改为“r”,并删除它下面的散列函数——包括“fclose(ftest)”——但我不认为这个进展......

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
#include <sys/inotify.h>
#include <openssl/sha.h>

int main (int argc, char *argv[])
{
int fd;
int wd;
unsigned char c[SHA512_DIGEST_LENGTH];
int i;
SHA512_CTX mdContext;
int bytes;
unsigned char data[1024];
const int event_size = sizeof(struct inotify_event);
const int buf_len = 1024 * (event_size + FILENAME_MAX);
FILE *ftest;

fd = inotify_init();

if (fd < 0) {
perror("inotify_init");
}

wd = inotify_add_watch(fd, "/home/joe/Documents", IN_CREATE);

while (1) {
char buff[buf_len];
int no_of_events, count = 0;

no_of_events = read (fd, buff, buf_len);
while (count < no_of_events) {
struct inotify_event *event = (struct inotify_event *)&buff[count];
if (event->len) {
if (event->mask & IN_CREATE)
if(!(event->mask & IN_ISDIR)) {
printf("The file %s has been created\n", event->name);

ftest=fopen(event->name, "rb"); //segmentation fault
//occurs here
SHA512_Init (&mdContext);
while ((bytes = fread (data, 1, 1024, ftest)) != 0)
SHA512_Update (&mdContext, data, bytes);
SHA512_Final (c,&mdContext);
for(i = 0; i < SHA512_DIGEST_LENGTH; i++) printf("%02x", c[i]);
printf (" %s\n", ftest);
fclose (ftest);
fflush(stdout);
}
}
count += event_size + event->len;
}
}
return 0;
}

通过 Valgrind 运行此程序后,它不提供段错误之前的任何错误详细信息,并且一旦发生错误,也不提供此后的详细信息。

最佳答案

你的问题是你没有检查任何返回值。必须检查和处理每个返回某些内容的函数调用。特别是你没有检查这个的返回值:

ftest=fopen(event->name, "rb");  //segmentation fault 

如果它返回 null(例如,因为 event->name 包含文件名,而不是完整路径,并且您没有在您正在监视的目录中运行),您将得到一个错误。

你也没有勾选这个

wd = inotify_add_watch(fd, "/home/joe/Documents", IN_CREATE);

可能还有其他人。

另一个问题是您在此处将文件句柄打印为字符串:

printf (" %s\n", ftest);

此外,为了在调试器和 valgrind 中获得有用的信息,您需要使用调试信息 (gcc -g) 进行构建

关于c - 在循环中打开文件时如何避免段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55048384/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com