2013-03-18 75 views
4

我的核心文件是通过附加到其名称的pid生成的,或者有时只有名称核心。我需要检查名称为core.pidcore的文件是否存在。我曾尝试使用stat(),其中我使用的路径字符串为/tmp/core*,但失败。你能不能让我知道如何解决这个问题。谢谢你的时间。如何检查文件中是否存在c

+0

试试这个 [http://stackoverflow.com/questions/230062/whats-the-best-way-to-check-if-一个文件-存在-在-C-跨平台] [1] [1]:http://stackoverflow.com/questions/230062/whats-the-best-way-to-check -if-a-file-exists-in-c-cross-platform – 2013-03-18 06:09:31

+0

@AkhilThayyil不相关,因为“pid”是通配符。 – 2013-03-18 06:25:47

回答

1

你应该只是stat()两个可能的名字,core.pidcore,看看是否有一个(或两者)存在。

您尝试stat()/tmp/core*表明您期望stat()接受shell glob模式。任何系统调用都不接受Shell glob模式。有一个C库函数fnmatch它允许你解决它们,你可以使用它......但在这种情况下,因为你只是检查两个不同的文件名,所以只需一次检查它们就可以更容易和更高效。

编辑:如果你不事先知道实际的文件名,但你只知道它与core.开始,后面跟着一个数字,那么你将不得不与opendir打开目录,列举中的所有文件它与readdir,并看看他们中的任何一个是否符合所需的模式(您可以使用fnmatch,或者只是手动解析它)。

+0

“core.pid”中的“pid”几乎肯定代表任意数字。 – 2013-03-18 06:09:55

+0

@Celada但我怎么知道PID值?它的coredump文件,每当一个进程崩溃。我需要检查名为core的文件是否附有pid。 – 2013-03-18 06:13:11

+0

@foo_l我明白了。对不起,我不清楚。 – Celada 2013-03-18 06:15:42

2

看起来像这样一直是answered before。虽然stat()是可以接受的,如果你只检查是否存在,我会用access()docs

+0

没有人似乎得到(即使OP写了“/ tmp/core *”)pid是一个进程ID,所以“core.pid”不是一个文字字符串。 – 2013-03-18 06:14:53

+1

不,您应该*不*使用'access()'来检查文件的存在。其目的是使用调用进程的真实UID和GID **而不是有效的UID和GID来检查对文件**的访问。在setuid程序中检查主叫用户是否有权访问文件很有用。对于使用有效的UID和GID(这是在尝试真正打开文件时将使用的凭据)的正常访问检查,请使用'stat()'。 – Celada 2013-03-18 06:15:01

2

如果你只是想检查一个新的文件是否已经出现,使用<dirent.h> API(opendir()readdir()等)在崩溃前后获取相关目录中的文件列表,然后比较两个列表,以查看第二次检查后是否有更多文件,如果是,则是哪一个。

0

我相信简单的方法是使用fopen()。

FILE *fp; 

// fopen won't work on "r" mode if file doesn't exist 
fp = fopen("core.pid","r"); 

if(fp == NULL){ 
    // File doesn't exist 
    ... 
}else{ 
    // File does exist 
    ... 
} 
-1

如果第二个参数是F_OK,访问只是简单地检查该文件的 存在。如果文件存在,则返回值为0;如果不是, 返回值是-1,errno设置为ENOENT。请注意,如果文件路径中的目录不可访问,则errno可能会将 设置为EACCES。

From the book "Advanced Linux Programming"

8

可以使用access功能:

if (0 == access(path, 0)) { 
    file exists; 
} 
else { 
    file does not exist; 
} 
+3

第二个访问参数('0')的常量别名为'F_OK' – JellicleCat 2016-01-25 20:56:23