我在使用 valgrind 测试我的垃圾箱时收到此消息:
==8454== Warning: invalid file descriptor 1024 in syscall close()
我打开一次,关闭一次。下面的函数 open() 文件,获取内容,然后 close() 文件。
int parse(t_struct *data)
{
int fd;
char *s;
if ((fd = open(data->file, O_RDONLY)) == -1)
{
fprintf(stderr, "Cannot open\n");
return (-1);
}
while ((s = gnl(fd)) != NULL)
{
if (list_add_elem_at_back(&data->list, s) == FALSE)
{
fprintf(stderr,"Cannot stock\n");
return (-1);
}
}
close(fd);
return (0);
}
问题出在哪里/什么?
if (list_add_elem_at_back(&data->list, s) == FALSE)
{
fprintf(stderr,"Cannot stock\n");
return (-1);
}
我不知道这是否是您问题的原因,但这是一个错误:如果
list_add_elem_at_back()
失败,您将退出 parse()
而不关闭文件。
使用
ulimit -n
,它会显示最大打开文件数,我猜你在某些代码中没有关闭 fd 。请跟踪您的代码,以了解每个 fopen
、 socket
或 select
必须有 close
。