• [APUE]进程控制(下)


    一、更改用户ID和组ID

      可以用setuid设置实际用户ID和有效用户ID。可以用setgid函数设置实际组ID和有效组ID。

    #include <sys/types.h>
    #include <unistd.h>
    int setuid(uid_t uid);
    int setgid(gid_t gid);
    返回值:成功为0,出错为-1

      有关改变用户ID的规则。

    • 若进程具有root特权,则setuid函数将实际用户ID、有效用户ID,以及保存的设置-用户-ID设置为uid。
    • 若进程没有root权限,但是uid等于实际用户ID或保存的设置-用户-ID,则setuid只将有效用用户ID设置为uid。不改变实际用户ID和保存的设置-用户-ID。
    • 如果上面两个条件都不满足,则errno设置为EPERM,并返回出错。

      在这里假定_POSIX+_SAVED_IDS为真。如果没有提供这种功能,则上面所说的关于保存的设置-用户-ID部分都无效。
      关于内核所维护的三个用户ID,还要注意以下:

    • 只有root用户可以修改实际用户ID。通常,实际用户ID是在用户登录时,由login程序设置的,而且绝不会改变它。因为login进程是一个root进程,当它调用setuid时,设置所有三个用户ID。
    • 仅当对程序文件设置了设置-用户-ID位时,exec函数设置有效用户ID。任何时候都可以调用setuid,将有效用户ID设置为实际用户ID或保存的设置-用户-ID。自然,不能将有效用户ID设置为任一随机值。
    • 保存的设置-用户-ID是由exec从有效用户ID复制的。在exec按文件用户ID设置了有效用户ID后,即进行这种复制,并将此副本保存起来。

      下表列出了改变这三个用户ID的不同方法

    1. setreuid和setregid函数

      4.3+BSD支持setregid函数,其功能是交换实际用户ID和有效用户ID的值。

    #include <sys/types.h>
    #include <unistd.h>
    int setreuid(uid_t ruid, uid_t euid);
    int setregid(gid_t rgid, gid_t egid);

    其作用是一个非特权用户总能交换实际用户ID和有效用户ID。这就允许一个设置-用户-ID程序转换成只具有用户的普通权限,以后又可再次切换回设置-用户-ID所得到大的额外权限。

    2. seteuid和setegid函数

      这两个函数只更改有效用户ID和有效组ID。

    #include <sys/types.h>
    #include <unistd.h>
    int seteuid(uid_t uid);
    int setegid(gid_t gid);
    返回值: 成功为0,出错为-1

    一个非特权用户可将有效用户ID设置为其实际用户ID获取保存的设置-用户-ID。对于一个特权用户可将有效用户ID设置为uid。

    3. 组ID

    以上所说明的一切都以类似方式适用于各个组ID,添加组ID不受setgid函数的影响。

    二、解释器文件

      解释器文件就是linxu中的shell脚本。这种文件是文本文件,其起始行的形式是:

    #! pathname [optional-argument]

      在感叹号和pathname之间的空格是可任选的。最常见的是以下列行开始:

    #! /bin/sh

      pathname通常是个绝对路径名,对它不进行什么特殊的处理(不适用PATH进行路径搜索)。
      很多系统对解释器文件第一行有长度限制(32个字符)。这包括#!、pathname、可选参数以及空格数。

    三、system函数

      ANSI C定义了system函数

    #include <stdlib.h>
    int system(const char *cmdstring);

      如果cmdstring是一个空指针,则仅当命令处理程序可用时,system返回非0值,这一特性可以决定在一个给定的操作系统上是否支持system函数。
      system在其实现中调用了fork、exec和waitpid,因此有三种返回值:
    (1) 如果fork失败或者waitpid返回除EINTR之外的出错,则system返回-1,而且errno中设置了错误类型。
    (2) 如果exec失败(表示不能执行shell),则其返回值如果shell执行了exit(127)一样。
    (3) 如果三个函数都成功,则system的返回值是shell的终止状态。   如果一个进程正以特殊的许可权 (设置-用户-I D或设置-组-I D )运行,它又想生成另一个进程执行另一个程序,则它应当直接使用fork和exec,而且在fork之后、exec之前要改回到普通许可权。设置-用户-I D或设置-组-I D程序决不应调用system函数。

    四、进程时间

      任一进程都可调用times函数以获得它自己及终止子进程的时钟时间、用户CPU时间和系统CPU时间。

    #include <sys/times.h>
    clock_t times(struct tms *buf);
    返回: 若成功则为经过的时钟时间,若出错则为-1

    此函数填写由buf指向的tms结构,该结构定义如下:

    struct tms {
        clock_t tms_utime; /* 用户CPU时间 */
        clock_t tms_stime; /* 系统CPU时间 */
        clock_t tms_cutime; /* 终止子进程用户CPU时间 */
        clock_t tms_cstime; /* 终止子进程系统CPU时间 */
    }

      此结构没有时钟时间。作为代替,times函数返回时钟时间作为函数值。此至是相对于过去的某一时刻度量的,所以不能用其绝对值而应该使用其相对值。例: 调用times,保存其返回值,在以后的某个时间再次调用times,从新返回的值中减去以前返回的值,此差值就是时钟时间。
      所有由次函数返回的clock_t值都用_SC_CLK_TCK(由sysconf函数返回的每秒时钟滴答数)转换成秒数。

  • 相关阅读:
    绿色简洁供应商采购后台管理系统模板——后台
    通用的电子商务商城后台管理界面模板——后台
    透明的企业网站卡通后台模板——后台
    绿色的宠物店cms后台管理系统模板——后台
    蓝色的cms企业记账管理后台模板源码——后台
    简洁的响应式博客后台管理模板——后台
    基于bootstrap物资管理系统后台模板——后台
    黑色的网站后台管理系统ui界面——后台
    蓝色的企业后台cms管理系统——后台
    黑色的cms商城网站后台管理模板——后台
  • 原文地址:https://www.cnblogs.com/orlion/p/6399325.html
Copyright © 2020-2023  润新知