项目和任务的API 函数
第2 章• 项目和任务17
用于访问project 数据库各项的代码示例
示例2–1 列显project 数据库中每项的前三个字段
本示例的要点包括以下内容:
setprojent() 开始会反绕project 数据库来进行启动。
getprojent() 是使用project.h 中定义的保守最大缓冲区大小来调用的。
endprojent() 用于关闭project 数据库并释放资源。
#include
struct project projent;
char buffer[PROJECT_BUFSZ]; /* Use safe buffer size from project.h */
...
struct project *pp;
setprojent(); /* Rewind the project database to start at the beginning */
while (1) {
pp = getprojent(&projent, buffer, PROJECT_BUFSZ);
if (pp == NULL)
break;
printf("%s:%d:%s\n", pp->pj_name, pp->pj_projid, pp->pj_comment);
...
};
endprojent(); /* Close the database and free project resources */
用于访问project 数据库各项的代码示例
18 Solaris 10 资源管理器开发者指南• 2006 年11 月
示例2–2 获取与调用方的项目ID 匹配的project 数据库项
以下示例调用getprojbyid() 来获取与调用方的项目ID 匹配的项目数据库项。然后,该示
例将列显项目名称和项目ID。
#include
struct project *pj;
char buffer[PROJECT_BUFSZ]; /* Use safe buffer size from project.h */
main()
{
projid_t pjid;
pjid = getprojid();
pj = getprojbyid(pjid, &projent, buffer, PROJECT_BUFSZ);
if (pj == NULL) {
/* fail; */
}
printf("Myproject (name, id) is (%s, %d)\n", pp->pj_name, pp->pj_projid);
}
与项目和任务关联的编程问题
编写应用程序时,请注意以下问题:
不存在可以显式创建新项目的函数。
如果project 数据库中不存在用户的缺省项目,则该用户无法登录。
用户登录时,系统会在该用户的缺省项目中创建新任务。
进程与新项目的关联会将新项目的资源控制和池成员关系应用于进程。
与项目和任务关联的编程问题
第2 章• 项目和任务19
setproject() 需要权限。如果您拥有进程,则newtask 命令不需要权限。虽然二者均可
用于创建任务,但仅有newtask 可以更改运行的进程对应的项目。
任务之间不存在任何父/子关系。
可以使用newtask -F 或setproject() 来创建最终任务,从而将调用方与新项目关联。尝
试准确估计总体资源记帐时,最终任务非常有用。
可重复执行函数getprojent()、getprojbyname()、getprojbyid()、getdefaultproj() 和
inproj() 会使用调用方提供的缓冲区来存储返回的结果。在单线程应用程序和多线程应
用程序中可以安全地使用这些函数。
可重复执行函数需要以下附加参数: proj、buffer 和bufsize。proj 参数必须是指向调
用方所分配的project 结构的指针。成功完成后,这些函数将返回此结构中的项目项。
project 结构所引用的存储空间是从buffer 参数指定的内存中分配的。bufsize 用于指
定大小(以字节数表示)。
如果使用不正确的缓冲区大小,则getprojent() 会返回NULL,并将errno 设置为
ERANGE。
与项目和任务关联的编程问题
20 Solaris 10 资源管理器开发者指南• 2006 年11 月
使用用于扩展记帐的C 接口
本章介绍用于扩展记帐的C 接口,包含以下主题:
第21 页中的“用于扩展记帐的C 接口概述”
第21 页中的“扩展记帐API 函数”
第23 页中的“访问exacct 文件的C 代码示例”
用于扩展记帐的C 接口概述
项目和任务用于标记和分隔工作负荷。扩展记帐子系统用于监视系统中正在运行的工作负
荷的资源占用情况。扩展记帐将生成工作负荷任务和进程的记帐记录。
有关扩展记帐和扩展记帐管理过程示例的概述,请参见《System Administration Guide:
Solaris Containers-Resource Management and Solaris Zones》中的第4 章“Extended Accounting
(Overview)” 和《System Administration Guide: Solaris Containers-Resource Management and
Solaris Zones》中的第5 章“Administering Extended Accounting (Tasks)”。
扩展记帐API 函数
扩展记帐API 包含用于执行以下操作的函数:
exacct 系统调用
对exacct 文件执行的操作
对exacct 对象执行的操作
杂项操作
exacct 系统调用
下表列出了与扩展记帐子系统交互的系统调用。
3第3 章
21
表3–1扩展记帐系统调用
函数说明
putacct(2) 使具有权限的进程能够使用特定于进程的其他数据来标记记帐记录
getacct(2) 使具有权限的进程能够从当前执行任务和进程的内核中请求扩展记帐缓冲区
wracct(2) 请求内核为指定的任务或进程写入资源使用情况的数据
对exacct 文件执行的操作
以下函数提供对exacct 文件的访问:
表3–2 exacct 文件函数
函数说明
ea_open(3EXACCT) 打开exacct 文件。
ea_close(3EXACCT) 关闭exacct 文件。
ea_get_object(3EXACCT) 首次对一组对象使用此函数会将数据读入ea_object_t 结构。随后
对该组使用此函数则会循环处理该组中的对象。
ea_write_object(3EXACCT) 将指定的对象附加到打开的exacct 文件中。
ea_next_object(3EXACCT) 将基本字段(eo_catalog 和eo_type)读入ea_object_t 结构中,
并反绕到记录头。
ea_previous_object(3EXACCT) 在exacct 文件中往回跳一个对象,并将基本字段(eo_catalog 和
eo_type)读入ea_object_t 中。
ea_get_hostname(3EXACCT) 获取在其上创建exacct 文件的主机名。
ea_get_creator(3EXACCT) 确定exacct 文件的创建者。
对exacct 对象执行的操作
以下函数用于访问exacct 对象:
表3–3 exacct 对象函数
函数说明
ea_set_item(3EXACCT) 指定exacct 对象并设置值。
ea_set_group(3EXACCT) 设置一组exacct 对象的值。
ea_match_object_catalog(3EXACC检T)查exacct 对象的掩码,以了解该对象是否具有特定目录标记。
扩展记帐API 函数
22 Solaris 10 资源管理器开发者指南• 2006 年11 月
表3–3 exacct 对象函数(续)
函数说明
ea_attach_to_object(3EXACCT) 将exacct 对象附加到指定的exacct 对象中。
ea_attach_to_group(3EXACCT) 将exacct 对象链作为指定组的成员项进行附加。
ea_free_item(3EXACCT) 在指定的exacct 对象中释放value 字段。
ea_free_object(3EXACCT) 释放指定的exacct 对象以及任何附加的对象分层结构。
杂项操作
以下函数与杂项操作相关联:
ea_error(3EXACCT)
ea_match_object_catalog(3EXACCT)
访问exacct 文件的C 代码示例
本节提供访问exacct 文件的代码示例。
示例3–1 显示与指定的pid 对应的exacct 数据
本示例显示内核中特定pid 的exacct 数据快照。
...
ea_object_t *scratch;
int unpk_flag = EUP_ALLOC; /* use the same allocation flag */
/* for unpack and free */
/* Omit return value checking, to keep code samples short */
bsize = getacct(P_PID, pid, NULL, 0);
buf = malloc(bsize);
阅读(538) | 评论(0) | 转发(0) |