C 函数调用前打开的文件(优化问题)?
我正试图更好地理解这一点。。。我在main中有一个函数,它只有在某些条件为真时才被调用-在该函数中是C 函数调用前打开的文件(优化问题)?,c,file,optimization,stat,C,File,Optimization,Stat,我正试图更好地理解这一点。。。我在main中有一个函数,它只有在某些条件为真时才被调用-在该函数中是 struct stat attr_buff; if (stat( filename, &attr_buff ) == -1) { ... " exit etc " ... } 如果满足所有条件,则会创建另一个线程来处理该文件,并使用以下命令打开该文件: f = fopen ((char *) filename, "rb"); if (f == NULL) { ... "
struct stat attr_buff;
if (stat( filename, &attr_buff ) == -1) {
... " exit etc " ...
}
如果满足所有条件,则会创建另一个线程来处理该文件,并使用以下命令打开该文件:
f = fopen ((char *) filename, "rb");
if (f == NULL) {
... " exit etc " ...
}
但是!如果我在gcc中打开optimization-O3,即使main中的函数没有被调用,我也会得到一个segfault,因为它甚至在所有检查完成之前就开始打开文件了?我必须承认我有点困惑。让我提一下,如果我使用access()而不是stat(),一切都很好。但是,由于可移植性,我需要stat()。。。发生了什么事?这看起来像是比赛状态。另外,请显示更多的代码,而不是对其进行描述。顺便说一句,
access
与stat
AFAIK一样具有可移植性,但您的代码中肯定存在问题。如果您使用access
,它可能在今天工作,但可能在明天或更新操作系统后失败,或者在另一台计算机上失败等。此外,在打开文件之前检查文件是否存在。检查后可以删除该文件。检查后,可以更改文件的权限。该文件可能有其他限制(ACL、SELinux),即使stat()
中的权限表示您可以打开它,也会阻止您打开它。换句话说,“检查文件,然后打开”的“检查”部分是无用的。它没有打开文件,因此它没有明确告诉您打开文件是否有效,并且它仍然可以更改后期检查。您已经在fopen
之后检查空指针。那么故障发生在哪里?@Krpan你需要找出故障发生的确切位置。问题中没有显示的代码中肯定有一个bug。