C语言程序片段中,按序列出所有的记号,并给每个记号以合理的属性值

来源:百度知道 编辑:UC知道 时间:2024/06/04 16:25:42
long gcd(p,q)
long p,q
{
if(p%q == 0)
return q;

else
return gcd(q,p%q);
}
补充一下:这个是编译原理的一道题!

access(user_id,inode,mode)的作用就是判断判user_id的用户对inode节点对应的文件是否拥有mode权限,如果拥有mode权限返回1,如果不拥有mode权限返回0.
以下代码中inode->di_mode是inode的文件权限属性值,通过位与(&)判断该属性值是否拥有包含相应的权限属性,如inode->di_mode&ODIREAD,如果值不为零,则inode的文件访问权限属性值包含ODIREAD权限,也就是其它用户对inode的文件拥有READ权限。
只要你明白了Linux下或Unix下的文件/目录访问权限关系,下面的代码就很简单了。

case READ: //mode == READ

/*如果inode的其它用户拥有READ权限(即inode->di_mode&ODIREAD 不等于0),那么user_id当然也拥有inode对应的文件的READ权限了*/
if (inode->di_mode&ODIREAD) return 1;

/*如果inode权限包含GDIREAD(inode->di_mode&GDIREAD不等于0,也就是文件组用户拥有对该文件的READ权限),user_id又属于相应的用户组(user[k].u_gid==inode->di_gid)) ),当然也就拥有READ权限了*/
if ((inode->di_mode&GDIREAD)&&(user[k].u_gid==inode->di_gid)) return 1;

/*如果inode属主拥有READ权限(也就是文件组用户拥有对该文件的READ权限),而user_id就是inode的用户属主(即user[k].u_uid==inode->di_uid),那user_id当然就有READ权限了*/
if ((inode->di_mode&UDIREAD)&&(user[k].u_uid==inode->di_uid)) return 1;
return 0;

...

这是一个求最大公约数的