Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 函数调用前打开的文件(优化问题)?_C_File_Optimization_Stat - Fatal编程技术网

C 函数调用前打开的文件(优化问题)?

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) { ... "

我正试图更好地理解这一点。。。我在main中有一个函数,它只有在某些条件为真时才被调用-在该函数中是

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。