ra_exec 子例程

用途

执行文件并将其附加到给定资源。

标准 C 库 (libc.a)

语法

#include <sys/rset.h>
int ra_execl(rstype, rsid, flags, path, argument0 [,argument1,...], 0)
rstype_t rstype;
rsid_t rsid;
unsigned int flags;
const char * path, argument0, argument1,...;
int ra_execle(rstype, rsid, flags, path, argument0[,argument1,...], 0, envptr)
rstype_t rstype;
rsid_t rsid;
unsigned int flags;
const char * path, argument0, argument1,...;
char * const envptr[];
int ra_execlp(rstype, rsid, flags, File, argument0[,argument1,...], 0)
rstype_t rstype;
rsid_t rsid;
unsigned int flags;
const char * File, argument0, argument1,...;
int ra_execv (rstype, rsid, flags, path, argumentv)
rstype_t rstype;
rsid_t rsid;
unsigned int flags;
const char * path;
char * const argumentv[];
int ra_execve (rstype, rsid, flags, path, argumentv, envptr)
rstype_t rstype;
rsid_t rsid;
unsigned int flags;
const char * path;
char * const argumentv[], envptr[];
int ra_execvp (rstype, rsid, flags, File, argumentv)
rstype_t rstype;
rsid_t rsid;
unsigned int flags;
const char * File;
char * const argumentv[];
int ra_exect(rstype, rsid, flags, path, argumentv, envptr)
rstype_t rstype;
rsid_t rsid;
unsigned int flags;
char * path, argumentv, envptr[];

描述

所有形式的 执行 (ra_exec) 子例程,在调用过程中执行一个新程序,并将该过程连接到由 雷斯特佩Rsid 参数指定的资源。 执行 (ra_exec) 子例程可以将新进程连接至资源集 (rstype R_RSET) 或 sradid (rstype R_SRADID)。

要成功将进程连接到资源集,必须满足以下条件:
  • 该资源集必须包含在系统中可用的处理器。
  • 该进程必须具有 root 用户权限或具有 CAP_NUMA_ATTACH 能力。
  • 调用线程不能具有到处理器的 bindprocessor 绑定。
  • 资源集必须包含在 (是以下项的子集) 中 进程的分区资源集。
注: 当使用 执行 子例程时,新的进程映像将继承其进程的资源集附件。

动态处理器取消分配和 DLPAR 可能会使正在指定的处理器连接失效。 程序必须成为 DLPAR Aware 才能解决此问题。

可以设置 标志 参数以指示用于使用 雷塞 参数中指定的资源集中包含的资源的策略。 唯一受支持的调度策略是 R_ATTACH_STRSET ,仅当系统的处理器以 同时多线程 方式运行时,此策略才有用。 POWER5 支持 同时多线程之类的处理器,其中每个物理处理器都有两个执行引擎,称为 硬件线程。 每个硬件线程基本上等同于单个处理器,并且每个线程在资源集中被标识为单独的处理器。 R_ATTACH_STRSET 标志指示该进程将使用单线程策略进行调度; 即,应该仅在每个物理处理器的一个硬件线程上调度该进程。 如果指定了此标志,那么资源集中指示的所有可用处理器都必须是独占使用的 (该处理器必须属于某个独占使用处理器资源集)。 新资源集 (称为 ST 资源集) 是根据指定的资源集构造的,并根据以下规则连接到流程:
  • 将忽略所有脱机处理器。
  • 如果物理处理器的所有硬件线程 (处理器) (以 同时多线程 方式运行时,每个物理处理器将有多个活动硬件线程) 未包括在指定的资源集中,那么在构造 ST 资源集时,将忽略该处理器的其他处理器。
  • 每个物理处理器只有一个处理器 (硬件线程) 资源包含在 ST 资源集中。

参数

执行 (ra_exec) 子例程具有与 执行 子例程相同的参数,但添加了下列新参数:

描述
雷斯特佩 指定新进程映像将附加到的资源的类型。 此参数必须是下列其中一项:
  • R_RSET: 资源集
  • R_SRADID: sradid
Rsid 标识新进程映像将连接到的资源:
  • 资源集句柄 (对于 rstype R_RSET): 将 rsid.at_rset 字段设置为期望的资源集。
  • SRADID (rstype R_SRADID 的调度程序资源分配域标识): 将 rsid.at_sradid 字段设置为所需的 sradid。
标志 指定要用于该进程的策略。 对于 rstype R_RSET , R_ATTACH_STRSET 标志指示要使用单线程策略 (每个物理处理器仅在一个硬件线程上) 来调度进程。 所有其他标志位都是保留的,必须指定为 0。

返回值

执行 (ra_exec) 子例程的返回值和 执行 子例程的返回值相同。

错误代码

执行 (ra_exec) 子例程的错误代码与 执行 子例程的错误代码相同,但增加了下列错误代码:

描述
EINVAL 发生了下列其中一个错误:
  • 雷斯特佩 参数包含无效的类型标识。
  • 标志 参数包含无效的标志值。
  • 指定了 R_ATTACH_STRSET 标志 参数,并且未将 雷塞 参数中的一个或多个处理器指定为互斥使用。
ENODEV 雷塞 参数指定的资源集不包含任何可用的处理器,或者指定了 R_ATTACH_STRSET 标志 参数,并且构造的 ST 资源集没有任何可用的处理器。
ENODEV 指定了无效的 rsid SRADID。
EFAULT 地址无效。
EPERM 发生了下列其中一个错误:
  • 调用进程既没有 root 用户权限,也没有 CAP_NUMA_ATTACH 连接特权。
  • 调用进程包含一个或多个具有 bindprocessor 处理器绑定的线程。
  • 指定的资源集未包括在调用进程的分区资源集内。
ENOTSUP 已尝试连接 SRADID ,并且已禁用 ENHANCED_AFFINITY。