我的核心文件是通过附加到其名称的pid生成的,或者有时只有名称核心。我需要检查名称为core.pid
或core
的文件是否存在。我曾尝试使用stat()
,其中我使用的路径字符串为/tmp/core*
,但失败。你能不能让我知道如何解决这个问题。谢谢你的时间。如何检查文件中是否存在c
回答
由于您使用Linux,你可以使用
http://man7.org/linux/man-pages/man3/glob.3.html
水珠会读取目录并返回匹配的模式,这就是你想要的名称的列表。
您也可能想要使用http://man7.org/linux/man-pages/man7/inotify.7.html来更改时只读取该目录。
你应该只是stat()
两个可能的名字,core.pid
和core
,看看是否有一个(或两者)存在。
您尝试stat()
/tmp/core*
表明您期望stat()
接受shell glob模式。任何系统调用都不接受Shell glob模式。有一个C库函数fnmatch它允许你解决它们,你可以使用它......但在这种情况下,因为你只是检查两个不同的文件名,所以只需一次检查它们就可以更容易和更高效。
编辑:如果你不事先知道实际的文件名,但你只知道它与core.
开始,后面跟着一个数字,那么你将不得不与opendir打开目录,列举中的所有文件它与readdir,并看看他们中的任何一个是否符合所需的模式(您可以使用fnmatch
,或者只是手动解析它)。
“core.pid”中的“pid”几乎肯定代表任意数字。 – 2013-03-18 06:09:55
@Celada但我怎么知道PID值?它的coredump文件,每当一个进程崩溃。我需要检查名为core的文件是否附有pid。 – 2013-03-18 06:13:11
@foo_l我明白了。对不起,我不清楚。 – Celada 2013-03-18 06:15:42
看起来像这样一直是answered before。虽然stat()
是可以接受的,如果你只检查是否存在,我会用access()
(docs)
没有人似乎得到(即使OP写了“/ tmp/core *”)pid是一个进程ID,所以“core.pid”不是一个文字字符串。 – 2013-03-18 06:14:53
不,您应该*不*使用'access()'来检查文件的存在。其目的是使用调用进程的真实UID和GID **而不是有效的UID和GID来检查对文件**的访问。在setuid程序中检查主叫用户是否有权访问文件很有用。对于使用有效的UID和GID(这是在尝试真正打开文件时将使用的凭据)的正常访问检查,请使用'stat()'。 – Celada 2013-03-18 06:15:01
如果你只是想检查一个新的文件是否已经出现,使用<dirent.h>
API(opendir()
,readdir()
等)在崩溃前后获取相关目录中的文件列表,然后比较两个列表,以查看第二次检查后是否有更多文件,如果是,则是哪一个。
我相信简单的方法是使用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
...
}
如果第二个参数是F_OK,访问只是简单地检查该文件的 存在。如果文件存在,则返回值为0;如果不是, 返回值是-1,errno设置为ENOENT。请注意,如果文件路径中的目录不可访问,则errno可能会将 设置为EACCES。
可以使用access
功能:
if (0 == access(path, 0)) {
file exists;
}
else {
file does not exist;
}
第二个访问参数('0')的常量别名为'F_OK' – JellicleCat 2016-01-25 20:56:23
试试这个 [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
@AkhilThayyil不相关,因为“pid”是通配符。 – 2013-03-18 06:25:47