[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函数返回的每秒时钟滴答数)转换成秒数。
[APUE]进程控制(下)的更多相关文章
- [APUE]进程控制(上)
一.进程标识 进程ID 0是调度进程,常常被称为交换进程(swapper).该进程并不执行任何磁盘上的程序--它是内核的一部分,因此也被称为系统进程.进程ID 1是init进程,在自举(bootstr ...
- [APUE]进程控制(中)
一.wait和waitpid函数 当一个进程正常或异常终止时会向父进程发送SIGCHLD信号.对于这种信号系统默认会忽略.调用wait/waidpid的进程可能会: 阻塞(如果其子进程都还在运行); ...
- [APUE]进程关系(下)
一.控制终端 对话期和进程组有一些其他特性: 一个对话期可以有一个单独的控制终端.通常是我们在其上登录的终端设备或伪终端设备. 建立与控制终端连接的对话期首进程,被称之为控制进程 一个对话期中的几个进 ...
- [APUE] 进程控制
APUE 一书的第八章学习笔记. 进程标识 大家都知道使用 PID 来标识的. 系统中的一些特殊进程: PID = 0: 调度进程,也称为交换进程 (Swapper) PID = 1: init 进程 ...
- (六) 一起学 Unix 环境高级编程 (APUE) 之 进程控制
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- APUE(8)---进程控制(1)
一.进程标识 每个进程都有一个非负整型标识的唯一进程ID.因为进程ID标识符总是唯一的,常将其用做其他标识符的一部分以保证其唯一性.进程ID虽然是唯一的, 但是却是可以复用的.ID为0的进程通常是调度 ...
- 进程控制(Note for apue and csapp)
1. Introduction We now turn to the process control provided by the UNIX System. This includes the cr ...
- Supervisor-类unix系统下的进程控制工具
如果你的英文足够好,请看官网的文档:http://supervisord.org/introduction.html 简介: Supervisor 类unix系统下的进程控制工具. 特性: 1.配置简 ...
- 《UNIX环境高级编程》(APUE) 笔记第八章 - 进程控制
8 - 进程控制 Github 地址 1. 进程标识 每个进程都有一个非负整型表示的 唯一进程 ID .进程 ID 是可复用的(延迟复用算法). ID 为 \(0\) 的进程通常是调度进程,常常被称为 ...
随机推荐
- log4Net 高性能写入和CSV格式
最近在使用log4net,在使用之前我们必须知道文件流是如何操作的,否则就是盲人摸向...,在FileAppender.cs文件里面有LockingModelBase来控制流的锁,默认有3个子类 Ex ...
- html-透明背景层
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- CentOS 安装 Hadoop 手记
Download & Install download hadoop from http://hadoop.apache.org/releases.html#Download downlo ...
- wifipineapple获取用户上网信息
ssh连接到wifipineapple: 输入连接信息:ssh root@172.16.42.1 输入密码:pineapplesareyummy 安装依赖基本环境: opkg update opkg ...
- 2D游戏新手引导点光源和类迷雾实现
一.新手引导须要的遮罩效果 一般做新手引导的时候,会把游戏画面变的半黑,然后须要玩家点击的地方就亮起来.经常使用的做法是採用遮罩来实现,可是仅仅能实现方形的,不能不规则图形.以及是全然挖空.做不到渐变 ...
- 【Zookeeper】源码分析之服务器(二)之ZooKeeperServer
一.前言 前面阐述了服务器的总体框架,下面来分析服务器的所有父类ZooKeeperServer. 二.ZooKeeperServer源码分析 2.1 类的继承关系 public class ZooKe ...
- 《Unix&Linux大学教程》学习笔记三:Shell常识
1:全局变量与局部变量 全局:可以从父进程传递给子进程的变量,如:环境变量. 局部:只能在特定的子Shell中使用的变量. 局部变量变全局:使用 “export 局部” 指令将创建的局部变量导出到环境 ...
- 〖Android〗我的ADT Eclipse定制
1. 配置自动补全: Windows -> preferences -> 搜索assist,修改 java xml自动触发补全:.abcdefghijklmnopqrstuvwxyzABC ...
- 【PMP】项目采购管理~重点知识
1.合同的类型与区别 固定总价(FFP):大多数买方都喜欢这种合同,因为货物的采购价格在一开始就已确定,并且不允许改变(除非工作范围发生变更) 总价加激励费用(FPIF):这种总价合同给买方和卖方提供 ...
- <转>详解C++的模板中typename关键字的用法
用处1, 用在模板定义里, 标明其后的模板参数是类型参数. 例如: template<typename T, typename Y> T foo(const T& t, const ...