Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/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_Unix - Fatal编程技术网

C 以下代码能否正确回答问题?

C 以下代码能否正确回答问题?,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 |

编写一个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 | 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的一部分。