C 以下代码能否正确回答问题?
编写一个C函数,该函数以文件名为参数,如果给定的文件存在,是普通文件,并且有人对其具有执行权限,则返回true,否则返回falseC 以下代码能否正确回答问题?,c,unix,C,Unix,编写一个C函数,该函数以文件名为参数,如果给定的文件存在,是普通文件,并且有人对其具有执行权限,则返回true,否则返回false int is_program(char *fname){ struct stat sb; int res; res = stat(fname, &sb); if(res == 0)/*if file exists*/ { if(S_ISREG(sb.st_mode) & (S_IXUSR |
int is_program(char *fname){
struct stat sb;
int res;
res = stat(fname, &sb);
if(res == 0)/*if file exists*/
{
if(S_ISREG(sb.st_mode) & (S_IXUSR | S_IXGPR | S_IXOTH))
return 1;
else
return 0;
}
return 0;
}
没有;你所拥有的不能完成你所要求的工作 您需要为常规文件分离测试:
ISREG(sb.st_mode)
从可执行性测试中:
(sb.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))
因此,您可以使用:
return (ret == 0) && ISREG(sb.st_mode) && (sb.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH));
您可能更愿意将其拆分:
if (ret != 0)
return 0;
if (!ISREG(sb.st_mode))
return 0;
return (sb.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH));
char*fname
应该是const char*fname
,因为没有理由拒绝常量。其余部分很容易测试。if(res)返回0;/*错误,可能不存在*/
将避免缩进潜艇的主要部分。如果,则无需使用内部。只需使用返回S_ISREG(sb.st_模式)和(S_IXUSR | S|uixgpr | S|IXOTH)
可能希望为您的特定操作系统(可能是某些unix或变体)添加标记。使用stat()
,各种S
宏,甚至“执行权限”的概念都不是标准C的一部分。