Linux 内核中的 if 语句中的按位 AND 有何帮助?

How does the bitwise AND help in the if statements in the Linux Kernel?

代码试图实现的背景: "新进程的各种参数(例如 euid、egid、参数列表、环境、文件名等) 随后传递给其他功能 为了简单起见,组合成一个结构 输入 linux_binprm。 prepare_binprm 用于提供多个父过程值(最重要的是, 有效的 UID 和 GID);剩下的数据——参数列表——然后被手动复制到 结构体。请注意,prepare_binprm 还负责处理 SUID 和 SGID 位:"

fs/exec.c

int prepare_binprm(struct linux_binprm *bprm)
{
...
    bprm->e_uid = current->euid;
    bprm->e_gid = current->egid;
if(!(bprm->file->f_vfsmnt->mnt_flags & MNT_NOSUID)) {
/* Set-uid? */
    if (mode & S_ISUID) {
    bprm->e_uid = inode->i_uid;
}
/* Set-gid? */
/*
* If setgid is set but no group execute bit then this
* is a candidate for mandatory locking, not a setgid
* executable.
*/
if ((mode & (S_ISGID | S_IXGRP)) == (S_ISGID |      S_IXGRP)) {
      bprm->e_gid = inode->i_gid;
  }
}
...
}

此处,if 语句中使用按位与 (&) 来分析标志。但这有什么用呢?比如,它检查的条件是什么,它是如何评估的?

来源:Linux 内核架构

按位与表达式 a & b 的结果是一个数字,在 ab 中设置的每一位的值为 1,而所有其他位的值为 0。如果该结果正好等于 b(例如),那么在 b 中设置的每个位也必须在 a 中设置。如果结果不等于 b,则必须在 b 中设置至少一个未在 a.

中设置的位

在您的特定示例中,mode 是文件模式位掩码,S_ISGID 是表示此类掩码的 set-group-id 位的宏,S_IXGRP 是表示此类掩码的组可执行位的宏。然后该条件评估 S_ISGID 位和 S_IXGRP 位是否都设置在 mode 中。如果常规文件具有这种情况的模式,则该文件是 setgid 可执行文件。