执行结果分析
xlzh@cmos:~/code/capability$ gcc child.c -o child
xlzh@cmos:~/code/capability$ gcc father.c -o father -lcap
xlzh@cmos:~/code/capability$ sudo setcap cap_dac_override,cap_sys_time+ei child
xlzh@cmos:~/code/capability$ sudo setcap cap_dac_override,cap_sys_time+ip father
/* 单独执行,child文件有E(effective)I(inheritable)的能力,执行child的终端没有任何能力, 套用公式(cap_bset默认全1)
* P'(permitted) = (P(inheritable) & F(inheritable)) | (F(permitted) & cap_bset)  // P'(permitted) = (0x0 & 0x2000002) | (0x0 & 全1),结果为0
* P'(effective) = F(effective) ? P'(permitted) : 0                               // P'(effective) = 1 ? P'(permitted) : 0, 结果为P'(permitted),即0
* P'(inheritable) = P(inheritable)                                               // P'(inheritable) = 0
* 执行结果如下所示
*/
xlzh@cmos:~/code/capability$ ./child
child Cap data permitted: 0x0, effective: 0x0, inheritable 0x0
/* 单独执行,child文件有E(effective)I(inheritable)的能力,执行child的father文件有E(inheritable)和P(permitted)能力, 套用公式
* P'(permitted) = (P(inheritable) & F(inheritable)) | (F(permitted) & cap_bset)  // P'(permitted) = (0x2000002 & 0x2000002) | (0x2000002 & 全1),结果为0
* P'(effective) = F(effective) ? P'(permitted) : 0                               // P'(effective) = 1 ? P'(permitted) : 0, 结果为P'(permitted),即0x2000002
* P'(inheritable) = P(inheritable)                                               // P'(inheritable) = 0x2000002
* 执行结果如下所示
*/
xlzh@cmos:~/code/capability$ ./father
father Cap data permitted: 0x2000002, effective: 0x0, inheritable: 0x2000002
child Cap data permitted: 0x2000002, effective: 0x2000002, inheritable 0x2000002
  上述单独运行child可执行程序,其进程没有任何能力。但是有father进程来启动运行child可执行程序,其进程则有相应的能力。
  上例中father和child的能力都设置的cap_dac_override和cap_sys_time两个能力。其实两个可执行程序设置的能力可以不同,各位读者可以自己修改其能力,套用公式进行计算。
  4、以root用户身份执行程序
  1、以root用户身份执行程序,则该进程所有能力的的P和I都置为1
  2、以root用户身份执行程序,则该进程的E使能
  /*由于执行child的终端进程没有I能力,所有child进程的inheritable也为0, 其他能力为全1*/
  xlzh@cmos:~/code/capability$ sudo ./child
  child Cap data permitted: 0xffffffff, effective: 0xffffffff, inheritable 0x0
  5、进程用户ID的变化对能力的影响
  1、当一个进程的有效用户ID从0变化到非0, 那么所有的E能力清零
  2、当一个进程的有效用户ID从非0变化到0,那么现有的P集合拷贝到E集合
  3、如果一个进行原来的真实用户ID,有效用户ID,保存设置用户ID是0,由于某些操作这些ID都变成了非0,那么所有的的P和E能力全部清理
  4、如果一个文件系统的用户ID从0变成非0,那么以下的能力在E集合中清除:CAP_CHOWN, CAP_DAC_OVERRIDE,  CAP_DAC_READ_SEARCH,  CAP_FOWNER,  CAP_FSETID,  CAP_LINUX_IMMUTABLE  (since  Linux  2.2.30),  CAP_MAC_OVERRIDE,  CAP_MKNOD,如果一个文件系统的用户ID从0变成非0,那么在P集合中使能的能力将设置到E集合中。