【发布时间】:2015-01-19 06:42:43
【问题描述】:
我在 CPP 中有一个多线程程序,它具有用于整个代码的日志记录功能。使用 fopen() 在主函数中打开一个日志文件,该日志记录函数将传递给日志记录函数的字符串写入其中。该函数还检查文件大小。如果它大于某个值,它使用 fclose() 关闭文件并使用 fopen() 打开一个新文件。这里的问题是我在 valgrind 日志“系统调用 write() 中的无效文件描述符 -1”中看到了这个错误。我想知道文件描述符的值变为-1的可能原因是什么。我还观察到在对打开的文件描述符进行任何操作的行上出现“无效的读/写”错误。这让我觉得可能是文件描述符的这个值导致了这个错误。任何提示将不胜感激。
【问题讨论】:
-
如果 open 返回 -1 它是一个错误指示符,可以在手册页等中看到...如果您使用此“文件描述符”进行读/写,则第一次没有检查错误地方,你应该做的。 open(...) 失败的原因可能有很多。如果它“突然”发生,即文件路径有效,则权限正常。并且磁盘上有足够的空间,很可能您的进程打开了太多文件。操作系统有每个进程的最大 opn 文件数。
-
对不起,我忘了说我使用的是 fopen() 和 fclose() 而不是 open() 和 creat()。
-
其他函数可能会在你背后使用 open/creat,也可能不会检查它们是否有有效的 fd。我的猜测仍然是您打开的文件太多...
标签: c++ linux valgrind file-handling