我在CPP中有一个多线程程序,它有一个在整个代码中使用的日志记录功能。使用fopen()在main函数中打开一个日志文件,此日志记录函数会将传递给日志记录函数的字符串写入其中。该函数还检查文件大小。如果它大于某个值,它将使用fclose()关闭文件并使用fopen()打开一个新文件。这里的问题是我在valgrind日志中看到这个错误“syscall write()中的无效文件描述符-1”。我想知道文件描述符的值变为-1的可能原因是什么。我还观察到在打开的文件描述符上的任何操作完成的行上出现“无效的读/写”错误。这让我觉得文件描述符的这个值可能导致此错误。任何提示都将受到高度赞赏。
答案 0 :(得分:3)
查看打开的手册页
---从手册页中剪切---------
RETURN VALUE
open() and creat() return the new file descriptor, or -1 if an error occurred (in which case, errno is set appropriately).
显然,您的代码不检查文件描述符(-1)上的错误条件并继续读/写,因此您看到错误。
您打开的每个文件都与文件描述符相关联(无论您使用fopen的事实如何)。 Valgrind正在跟踪您的系统调用跟踪(读/写)。 FILE *只是文件描述符的包装器。所以,错误陈述与" -1"相关。 fd仍然表示你正在读取/写入一个无效的文件(可能是你的进程耗尽了最大的fd分配)等。为了理解它,我建议你做一个系统调用跟踪过程使用" strace"。你会看到" fopen" (用户/库级别api)内部调用"打开" (系统调用)。
希望它有所帮助!
答案 1 :(得分:2)
如果多个线程正在使用相同的FILE *,那么如果没有围绕对fopen,fclose和fwrite的所有调用进行锁定,则可能遇到许多问题。当您重新打开文件时,可能有另一个线程试图写入它。 fwrite还执行缓冲写入,并且在缓冲区上运行的多个线程可能导致内存损坏。