BEA_tuxedo

BEA Tuxedo

 

一、    错误消息处理

1.全局变量tperrno

当一个ATMI调用发生错误时,全局变量tperrno被设置,它指示发生错误的原因。可选值如下:

代码

解释

TPEABORT

Transaction can not commit

TPEBADDESC

Bad descriptor for tpgetrply(3c)

TPEBLOCK

Blocking condition found and no-block specified

TPEINVAL

Invalid arguments given

TPELIMIT

Too many handles outstanding

TPENOENT

No entry found or no room on the Bulletin Board

TPEOS

Operating system error

TPEPERM

Bad permissions or failed authentication

TPEPROTO

Protocol error

TPESVCERR

Server error while handling request

TPESVCFAIL

Application level service failure

TPESYSTEM

Internal BEA TUXEDO error (userlog(3c)) message written)

TPETIME

Time-out occurred and TPNOTIME was not specified

TPETRAN

Caller in transaction mode and transaction aborted

TPGOTSIG

Signal received and TPSIGRSTRT not specified

TPERMERR

Resource Manager failure

TPEITYPE

Type and/or subtype do not match services

TPEOTYPE

Type and/or subtype do not match buffers or unknown

TPERELEASE

Caller has made a 3.0 library call

TPEHAZARD

Hazard exists that transaction heuristically completed

TPEHEURISTIC

Transaction heuristically completed

TPEEVENT

Event occurred

TPEMATCH

Service name cannot be advertised due to matching conflict

 

2.错误函数tpstrerror

char *tpstrerror(int tperrno);

根据错误号tperrno生成一个错误信息串,把串的起始地址返回。

当错误是TPESYSTEM或TPEOS时,一个消息写到userlog文件。

 

 

二、    buffer管理

1.buffer类型

在tuxedo的通讯中使用的缓冲区都要使用一套自己API来生成和释放。buffer类型有CARRAY、STRING、FML、FML32、VIEW和VIEW32等。

类型

说明

STRING

字符串,以null结尾

CARRAY

有长度的字节流

X_OCTET

 

FML

fielded buffers

 

FML32

 

VIEW

C结构

 

VIEW32

 

X_C_TYPE

 

 

X_COMMON

 

 

以上类型中,只有VIEW系列类型是有子类型(subtype)的。FML和VIEW在后面会有详细的说明。

 

2.STRING型

STRING类型主要用于处理变长的文本数据;

必须以null结尾;

STRING要在配置文件的MACHINES部分用TYPE配置;

STRING类型只由字符组成,在结构不同或使用不同的字符集的机器之前传输时,自动进行XDR encode/decode处理。

 

3.CARRAY型

CARRAY类型用于与机器无关的数据;

该类型要指定长度,数据中可以包含null数据;

tuxedo不关心数据的内容,不进行XDR encode/decode转换。

 

4.分配buffer-tpalloc

char *tpalloc(char *type, char *subtype, long size);

成功返回分配的缓冲区首地址,失败返回NULL

参数说明:

type:buffer类型;

subtype:子类型,没有子类型的填NULL;

size:分配的缓冲区大小;

buffer类型是CARRAY、STRING、FML、FML32、VIEW和VIEW32。

失败原因主要有:

· 参数错;

· 协议错,如之前尚未调用tpinit;

· 操作系统错;

· tuxedo底层错。

 

5.重分配buffer-tprealloc

char *tprealloc(char *bufptr, long size);

成功返回新的缓冲区地址,失败返回NULL

参数说明:

bufptr:先前分配的buffer地址;

size:新的大小;

函数改变原来分配的空间的大小,并把原来的数据拷贝到新的缓冲区中。

失败原因主要有:

· 无效的原指针;

· 协议错,如之前尚未调用tpinit;

· 操作系统错;

· tuxedo底层错。

 

6.释放buffer-tpfree

void tpfree(char *bufptr);

参数说明:

bufptr:分配的buffer地址;

函数没有返回值,不返回任何错误,tperrno被设置为0。

 

7.查询buffer的类型-tptypes

long tptypes(char *bufptr, char *type, char *subtype);

函数成功返回buffer的长度,失败返回-1

参数说明:

bufptr:buffer地址;

type:成功返回的buffer类型;

subtype:成功返回的buffer子类型;

失败原因主要有:

· 无效的原指针;

· 协议错,如之前尚未调用tpinit;

· 操作系统错;

· tuxedo底层错。

 

 

三、    clientATMI

ATMI:Application-to-Transaction Monitor Interface。

1.tpchkauth

int tpchkauth();

在调用tpinit()之前检查是否需要认证和认证的级别。

返回值:

· TPNOAUTH:不需要认证;

· TPSYSAUTH:系统认证,需要密码;

· TPAPPAUTH:应用认证,需要密码和特殊应用数据;

当返回值为TPSYSAUTH和TPAPPAUTH时,我们必须使用tpalloc()分配一个TPINIT结构,在该结构中填入认证数据,然后用该结构作为参数调用tpinit()。

失败原因主要有:

· 协议错;

· 操作系统错;

· tuxedo底层错。

 

2.tpinit

在使用tuxedo其他服务之前,必须调用tpinit加入到应用中。

int tpinit(TPINIT *tpinfo);

参数说明:

tpinfo:指向TPINIT类型的指针。

TPINIT类型在atmi.h中有定义,如以下几个域:

    char usrname [32]; (32 characters significant)

    char cltname [32]; (32 characters significant)

    char passwd [32]; (8 characters significant)

    char grpname [32]; (32 characters significant)

    long flags;

    long datalen;

    long data;

usrname:用户名或login名;

cltname:应用定义;

passwd:应用密码;

grpname:在事务中使用,必须在配置文件定义的组列表中;

flags:定义请求/通知类型和系统存取方法,其中TPU_SIG、TPU_DIP和TPU_IGN不能同时指定;TPSA_FASTPATH和TPSA_PROTECTED不能同时指定。有如下的值:

· TPU_SIG:选择信号通知;

· TPU_DIP:选择dip-in通知;

· TPU_IGN:忽略通知;

· TPSA_FASTPATH:选择fastpath方式系统存取;

· TPSA_PROTECTED:选择protected方式系统存取;

datalen:应用特殊数据的长度;

data:应用特殊数据;

域flags的值覆盖系统的缺省定义,前提是在配置文件中没有指定NO_OVERRIDE。

如果参数使用(TPINIT*)NULL,则client使用系统缺省的通知设置和系统存取设置,若需要认证,则出错返回TPEPERM。

tpinit()调用失败返回-1,失败原因有:

· 参数错;

· 没有空间在BB;

· 没有权限;

· 协议错;

· 操作系统错;

· tuxedo底层错。

示例:

TPINIT *tpinfo;

char password[9];

/* prompt user for password */

if ((tpinfo = (TPINIT *)tpalloc(“TPINIT”,NULL,TPINITNEED(0))) == NULL) {

    (void)userlog(“unable to allocate TPINIT buffer”);

    exit(1);

}

(void)strcpy(tpinfo->passwd, password);

(void)strcpy(tpinfo->usrname, “Smith”);

(void)strcpy(tpinfo->cltname, “Teller”);

tpinfo->flags = (TPU_DIP|TPSA_PROTECTED);

if (tpinit(tpinfo) == -1) {

    (void)userlog(“failed to join application”);

    tpfree((char*)tpinfo);

    exit(1);

}

 

3.tperm

使用tuxedo服务完毕,调用tpterm()离开应用。

int tpterm();

函数出错返回-1。

错误原因有:

· 协议错;

· 操作系统错;

· tuxedo底层错。

 

4.tpacall

发送异步请求。

int tpacall(char *service, char *bufptr, long length, long flags);

参数说明:

service:请求的service名(最大15个字符,以null结尾);

bufptr:请求发送的数据;

length:发送数据长度(只有CARRAY类型用,其他设为0);

flags:发送模式,有如下的值:

· TPNOTRAN:该次调用不能在一个事务里;

· TPNOREPLY:不需要回应(reply);

· TPNOBLOCK:非阻塞;

· TPNOTIME:不超时,一直等待;

· TPSIGRSTRT:被信号中断的系统调用重启。

成功返回一个非负的描述符,该描述符可用于后续的tpgetrply调用,出错返回-1。

错误原因有:

· 参数错;

· 当前太多的tpacall处理存在,上限是50;

· 事务错;

· 超时(time-out);

 

5.tpgetrply

接收异步回应数据。

int tpgetrply(int *handle, char **bufpp, long *length, long flags);

参数说明:

handle:tpacall返回的描述符;

bufpp:接收buffer的地址的地址,原buffer会自动调整;

length:接收的buffer的长度的地址;

flags:接收选项。有如下值:

· TPNOBLOCK:非阻塞;

· TPNOTIME:不超时,一直等待;

· TPSIGRSTRT:被信号中断的系统调用重启;

· TPGETANY:接收任何回应;

· TPNOCHANGE:要求接收的回应与发送数据相同。

成功返回0,失败返回-1。

出错原因:

· 参数错;

· 错误的接收buffer类型;

· 超时;

· 其他错误;

 

6.tpcancel

取消由tpacall发送的请求的响应,在没有事务未完时。不能取消一个已经处理的请求。

int tpcancel(int handle);

参数说明:

handle:tpacall返回的描述符;

出错返回-1。错误原因有:

· 错误的描述符;

· 当前在事务模式;

· 其他错误;

 

7.tpcall

同步发送请求并接收回应数据。

int tpcall(char *service, char *sbufp, long slength, \

        char **rbufpp, long *rlength, long flags);

参数说明:

service:请求的service名;

bufp:发送buffer的地址;

slength:发送数据长度(只CARRAY使用,其他为0);

rbufpp:响应buffer的地址的地址,可以与发送buffer为同一块区域;

rlength:响应buffer的长度的地址(不能为NULL);

flags:标志。有如下值(含义见tpacall和tpgetrply):

· TPNOTRAN

· TPNOCHANGE

· TPNOBLOCK

· TPNOTIME

· TPSIGRSTRT

返回-1表示出错,其他返回值都表示成功。

错误原因与tpacall和tpgetrply相同,除了描述符错。

 

8.tpgprio

获得上一次请求或接收的消息的优先级。

int tpgprio();

成功返回的范围是1-100,值越大优先级越高。失败返回-1。

使用举例:

struct {

    int hdl; /* handle*/

    int pr; /* priority*/

} pa[SIZE];

 

for (i=0; i < requests; i++) {

    /* Determine service and data for request */

    pa [i].hdl = tpacall(Svc, buf, len, flags);

    /* Save priority used to send request */

    pa[i].pr = tpgprio();

}

/* Use qsort(3) routine to sort handles in priority order */

qsort((char*) pa, requests, sizeof(pa[0]), cmpfcn);

for (i=0; i< requests; i++) {

    tpgetrply(&pa[i].hdl, &rbufp, &rlen, rflags);

}

 

9.tpsprio

设置下一个要发送的消息的优先级。

int tpsprio (int prio, long flags);

参数说明:

prio:要设置的优先级;

flags:标志。有如下值:

· 0:使用相对优先级,值改为(default+prio);

· TPABSOLUTE:绝对优先级,值改为prio;

优先级的范围是1-100,超过次限制的值被改为相应的最大(小)值。

失败返回-1。错误原因有TPEINVAL、TPEPROTO、TPESYSTEM、和TPEOS。

 

四、    serverATMI

在server端tuxedo本身提供了一个标准的main()函数,它负责完成一些必要的工作。server端编程只需要编写service处理函数,进行service的请求处理和回应处理。所以,在server端不需要调用tpinit()和tpterm()。

 

1.TPSVCINFO

每个service函数都有统一的形式:

void tpservice(TPSVCINFO *svcinfo);

只有一个参数,该参数是指向TPSVCINFO结构的指针(atmi.h)。该结构定义如下:

struct tpsvcinfo {

    char name[32];   /*service名(最大15个字符)*/

    long flags;      /* client调用时指定的flags */

    char *data;      /* 接收的数据地址 */

    long len;        /* 数据长度 */

    int cd;         /* 会话方式下的连接描述符 */

    long appkey;     /* 应用认证的key */

    CLIENTID cltid;  /* client ID */

};

 

2.buffer管理

在service函数里,一样可以调用tpalloc()、tpfree()、tprealloc()处理自定义的buffer。

通过TPSVCINFO参数传递的buffer是使用tpalloc()分配的,所以可以对它使用tprealloc()。

要注意的是在service函数里自己调用tpalloc()分配的空间在退出要释放,除非该空间作为tpreturn()或tpforward()的参数。如果分配的空间不释放,最终会耗尽该server的内存资源。

对于TPSVCINFO传递的buffer不用手动释放。

使用举例:

void

BAL(TPSVCINFO* input)

{

    char *f, *f1, *f2;

    f=input->data;

    f1=tpalloc(“STRING”, NULL, 80);

    f2=tpalloc(“STRING”, NULL, 120);

    . . .

    tpfree((char *) f2);

    tpreturn (TPSUCCESS, 0, f1, 0, 0);

}

可以使用tptypes()查看buffer的类型。如:

void ABAL(TPSVCINFO *transb)

{

    char type[20], subtype[20];

    long len;

    len = tptypes(transb->data, type, subtype);

    if (len == 0) {

        /*error*/

        userlog(“NULL message sent...\n”);

        ...

    }

    if (strcmp(type, “FML”) == 0) {

        /* convert FML to aud VIEW; */

    } else if (strcmp(type, “VIEW”) == 0) {

        if (strcmp(subtype, “aud”) != 0) {

            /*error*/

            userlog(“Wrong VIEW subtype...”);

            ...

        }

    } else {

        /*error*/

        userlog(“Invalid buffer type ...”);

        ...

    }

}

 

3.server的client角色

tuxedo的机制允许一个server程序作为client,调用tpcall()去请求别的service服务。这样做可以避免代码的冗余,但效率上会有牺牲。

这样做时有一些情况要注意:

· 如果一个server要把负责返回接收到的buffer,则不要使用这个buffer作为参数来请求别的service服务。可以分配辅助性的buffer来处理,这样做可以避免在tpcall()过程中改变了输入buffer的内容和类型。

· 一个server不能请求一个只被它本身发布的service。这样做会导致死锁。例外是请求时指定TPNOREPLY标志。

 

4.tpadvertise

service可以在启动时发布,也可使用tmadmin或使用tpadvertise动态发布。

int tpadvertise(char *svcname, void (*func)(TPSVCINFO *));

参数说明:

svcname:要发布的service名;

func:该service对应的处理函数指针;

如果该service用func已经发布,则函数立即成功返回。如果调用server是MSSQ集的一员,则该MQSQ中的所有server都发布这个service。失败时返回-1。

出错原因:

· 该service已经用别的函数发布了;

· 超过了最大允许发布的service数量(MAXSERVICES);

· 参数错误(有为NULL的);

· 协议错;

· 操作系统错等。

 

5.tpunadvertise

一个server取消发布一个它已经发布的service。

int tpunadvertise(char *svcname);

参数说明:

vcname:操作的service名;

如果调用server是MSSQ集的一员,则该MQSQ中的所有server都取消发布这个service。失败时返回-1。

失败原因:

· service没有发布;

· 参数错误;

· 协议错等。

 

6.tpreturn

普通的C函数返回时使用return语句。但在tuxedo程序里,不能使用return,必须使用tpreturn()终止当前处理并发送回应给请求端;或者使用tpforward()把请求传递给别的service处理。

void tpreturn(int rval, int rcode, char *data,long len, long flags);

参数说明:

rval:返回值,决定该service请求是否成功。如三个可选值:

· TPSUCCESS:成功。tpcall和tpgetrply将返回一个非负值;如果是会话service,则产生TPEV_SVCSUCC事件;

· TPFAIL:失败。tpcall和tpgetrply将返回-1;tperrno设置为TPESVCFAIL,如果是会话service,则产生TPEV_SVCFAIL事件;

· TPEXIT:除了TPFAIL的功能外,该server随后将终止,如果配置了重启动,则该server将重新启动。

rcode:应用定义的返回码。service将向client返回该数字,tuxedo本身不对其做任何解释,接收端通过全局变量tpurcode得到该值,在成功或失败时该值都会返回;

data:返回给client端的数据buffer;

len:返回数据的长度(只CARRAY类型有用);

flags:标志,当前没用。

 

7.tpforward

调用tpforward的server不向client返回数据,而是把更新过的buffer传递给另一个service做更多的处理,由它处理返回client数据等后续的工作。本身则返回到标准的main流程中。

void tpforward(char *service, char *data, long len, long flags);

参数说明:

service:后续的service的名称;

data:指向传递的buffer的指针;

len:buffer的长度(只CARRAY有用);

flags:当前没有使用;

该函数不能用在会话service中。

 

8.tpsvrinit/tpsvrdone

在一个server的实例启动时会调用tpsvrinit(),在结束时会调用tpsvrdown()。如果应用没有定义这两个函数,则使用tuxedo提供的缺省函数。

int tpsvrinit(int argc, char **argv);

参数说明:形式类似与main函数的参数,函数里可以使用getopt和全局变量optind进行处理,配置文件中的CLOPT命令行选项也传递到该函数。

函数成功返回0,失败返回-1。

void tpsvrdone();

 

 

五、    会话ATMI

1.概念

会话是一个半双工的链路,同一时刻只有一方能发送,另一方只能接收。

会话的client方开始时也要调用tpinit()加入到tuxedo应用中,通讯使用的缓冲区也要用tpalloc()分配。

在会话中有如下几个角色:

· originator, initiator:执行tpconnect开始会话的一方;

· subordinate:接收tpconnect的会话server;

· sender:控制着会话连接的一方;

· receiver:没有会话连接控制权的一方。

 

2.tpconnect

建立与会话service的连接。

int tpconnect(char* name, char *data, long length, long flags);

参数说明:

name:会话service的名称;

data:发送数据的buffer,可以是NULL;

length:buffer的长度(必要的话);

flags:标志。有如下值:

· TPNOTRAN:与tpacall介绍的相同;

· TPNOBLOCK:(同上);

· TPNOTIME:(同上);

· TPSIGRSTRT:(同上);

· TPSENDONLY:对建立的连接具有控制权,initiator将发送数据,被调用方只能接收数据;

· TPRECVONLY:建立连接后把控制权交给被调用方,initiator只能接收数据;

TPSENDONLY和TPRECVONLY必须指定一个,以决定会话的控制权和方向,之后控制权和方向的改变由sender决定。

成功返回一个非负的连接描述符,供后面的tpsend()、tprecv()和tpdiscon()使用。失败返回-1。

失败原因:

· 无效的参数;

· 太多的连接要建立。每个进程允许建立10条连接;

· 错误的service名或非会话service。

 

3.tpsend

在一个会话连接中发送消息。

int tpsend(int cd, char *data, long length, long flags,long *revent);

参数说明:

cd:会话连接描述符(tpconnect返回值);

data:发送的数据指针。可以为NULL,如交换控制权;

length:发送数据的长度(必要的话);

flags:标志。

· TPNOBLOCK:同tpacall;

· TPNOTIME:(同上);

· TPSIGRSTRT:(同上);

· TPRECVONLY:在发送数据之后,放弃连接的控制权;这将导致对方收到TPEV_SENDONLY事件;

revent:当tperrno为TPEEVENT时返回的事件值。

失败时函数返回-1,tperrno被设置。当tperrno为TPEEVENT时,导致失败的具体事件存放在revent中。

调用tpsend()可能出现的revent值有:

· TPEV_DISCONIMM:当会话的originator执行tpdiscon()、tpreturn()、tpcommit()时subordinate会收到该事件;当进程或网络错误时originator也会收到此事件;

· TPEV_SVCFAIL:当subordinate没有会话的控制权而使用TPFAIL和TPEXIT执行tpreturn时originator将收到该事件;

· TPEV_SVCERR:当subordinate没有会话的控制权而使用TPSUCCESS执行tpreturn时originator将收到该事件;

 

4.tprecv

没有会话控制权的一方执行接收消息。

int tprecv(int cd, char **data, long *length, long flags, long *revent);

参数说明:

cd:会话连接描述符;

data:接收buffer的地址的地址;

length:接收数据的长度的地址;

flags:标志。可选值:

· TPNOCHANGE:参见tpacall();

· TPNOBLOCK:同上;

· TPNOTIME:同上;

· TPSIGRSTRT:同上;

revent:当tperrno为TPEEVENT时返回的事件值。

失败时函数返回-1,tperrno被设置。当tperrno为TPEEVENT时,导致失败的具体事件存放在revent中。

调用tprecv()可能出现的revent值有:

· TPEV_DISCONIMM:当会话的originator执行tpdiscon()、tpreturn()、tpcommit()时subordinate会收到该事件;当进程或网络错误时originator也会收到此事件;

· TPEV_SENDONLY:发送方已经放弃了控制权,调用进程当前只能发送不能接收。也可用此方法获得调用者当前处于的模式;

· TPEV_SVCFAIL:当subordinate没有会话的控制权而使用TPFAIL和TPEXIT执行tpreturn时originator将收到该事件;

· TPEV_SVCERR:当subordinate没有会话的控制权而使用TPSUCCESS执行tpreturn时originator将收到该事件;

· TPEV_SVCSUCC:subordinate成功结束并正在关闭连接(必须是会话的最后一个事件)。

使用举例:

for (;;) {

    (void)gets(reply);

    if (strcmp(reply, “q”) == 0 )

        break;

    (void) strcpy(line, reply);

    /* send balance request and relinquish line control.*/

    if (tpsend(cd,line,0,TPRECVONLY,&revent) == -1) {

        (void)tpterm();

        exit(1);

    }

    /* wait for service to return balance request results.*/

    if (tprecv(cd, &line, &len,TPNOCHANGE, &revent) != -1) {

        (void) userlog(“TPEV_SENDONLY event expected”);

        (void)tpterm();

        exit(1);

    }

    /*anything other than a send event is an error.*/

    if ((tperrno != TPEEVENT) || \

               (tperrno == TPEEVENT && revent != TPEV_SENDONLY)) {

        (void)tpterm();

        exit(1);

    }

    (void) printf(Another request ?? %s\n ”,line);

}

 

5.tpdiscon

该函数只能由会话的建立方originator执行,这导致会话非正常的终止。

int tpdiscon(int cd);

参数说明:

cd:会话连接描述符。

该函数执行后将导致对方收到一个TPEV_DISCONIMM事件。这种方法可能会丢失数据,关闭会话连接的好的方法是由service执行tpreturn。

失败返回-1。出错原因可能有:TPEBADDESC、TPETIME。

 

6.会话server正常返回的流程示例

1.  client执行tpconnect(),使用标志TPSENDONLY,控制连接;

2.  client使用标志TPRECVONLY调用tpsend(),把控制权交个对方,在server端产生TPEV_SENDONLY事件;

3.  server执行tpreturn(),标志TPSUCCESS,中断连接,给client产生一个TEEV_SVCSUCC事件;

4.  client调用tprecv(),获得该事件,得知连接已经关闭。

 

7.会话server不正常返回流程示例

1.  client执行tpconnect(),使用标志TPSENDONLY,控制连接;

2.  client不使用标志调用tpsend(),控制权仍在client端;

3.  server使用tprecv()得知自己不能send数据;

4.  server发生错误,在没有控制权的情况下执行tpreturn(),使用标志TPFAIL,给client产生TPEV_SVCERR;

5.  当client调用tpsend()时得到这个事件。

 

 

六、    VIEW类型

VIEW(VIEW32)类型的buffer用于传输C结构数据。

 

1.VIEW(VIEW32)文件

tuxedo处理C结构需要一个文件,描述与C结构的映射和可能存在的FML模式转换。

文件的每一行描述C结构中的一个域,每行的格式如下:

type:域的数据类型。可选值:short、long、float、double、char、string、CARRAY;

cname:C结构域名;

fbname:FML buffer域名;

count:元素个数;

flag:标志。可选值(下列之一):

· P:

· S:

· F:

· N:

· C:

· L:

size:STRING或CARRAY型的大小,对于小数,两个数用”,”分隔;

NULL:定义该域的null值。若不定义,则tuxedo的缺省定义如下:对所有的数字型是0或(0.0);对char型是”\0”;对STRING和CARRAY是””。定义时可以使用反斜线转义字符。指定关键字NONE表示该域没有缺省null值。对string和字符数组最大可为2660个字符。

文件中以“#”打头的行是注释,被忽略;以“$”开头的行也是注释,但它会被拷贝到生成的C头文件里。

示例:

VIEW aud

$ /* VIEW structure for audit information */

#type  cname  fbname  count  flag  size null

long  b_id  BRANCH_ID  1   -    -   0

float  balance  BALANCE  1  -    -   0.0

string  ermsg  STATLIN   1   -   80   “”

END

 

2.VIEWC编译器

上一节形成了VIEW的描述文件(后缀为.v)后,还要使用VIEWC编译器编译形成一个C头文件(.h)和二进制文件(.V)。

VIEWC的语法如下:

viewc [-n] [-d viewdir] [-C] viewfile [viewfile ...]

viewc32 [-n] [-d viewdir] [-C] viewfile [viewfile ...]

其中viewfile就是上面的描述文件。

选项的含义如下:

-d viewdir:指定输出文件的存放路径(缺省放在当前目录);

-C:生成一份COBOL的拷贝,放在当前目录;

-n:不处理FML映射。

 

3.头文件

viewc生成的头文件包含结构的定义,可用于应用程序中。如:

/* VIEW structure for audit information */

struct aud {

    long b_id;      /* null=0 */

    float balance;    /* null=0.000000 */

    char ermsg[80];  /* null=”” */

};

 

4.环境变量

在应用中使用VIEW,要指定二进制文件(.V或.VV)的存取路径。这通过设置如下的环境变量来实现:

VIEWFILES(VIEWFILES32):用逗号分隔的VIEW文件列表;

VIEWDIR(VIEWDIR32):用冒号分隔的路径列表;

若使用了FML,还要指定FML相关的环境变量。

注意:上面的文件列表、路径列表中间不能有空白字符。

 

 

七、    FML类型

1.概述

(1).基本概念

Field Manipulation Language(FML)或(FML32)可以定义多个有名字的域,它是一张属性和值的表。

支持的域数据类型有:short、char、long、float、double、string、carray。

FML(FML32)buffer通过一套API来管理,大约有60多个函数接口。

FML有较强大的功能,使用也很灵活。缺点是接口较复杂,有很多的处理函数,而且使用效率较VIEW等要慢。

(2).FML的基本组成部分

FML buffer的域通过域ID(数字)来访问。处理FML buffer至少需要如下四个部分:

· 域表文件。提供名字-数字映射;

· 域头文件。提供C程序一些生成的宏而不是数字来访问域;

· 环境变量FIELDTBLS(32)和FLDTBLDIR(32)定位表文件;

· C语言接口:

库:libfml.a和libfml32.a;

头文件:fml.h和fml32.h;

处理16位到32位转换代码:fml1632.h。

(3).FML buffer的结构

一个域buffer有三部分组成:buffer头部、数据域和索引项。

(4).处理FML的流程

定义所有的域名字、对应的数据类型和数字标识。数字标识100以下为系统保留,对16位buffer,数字标识的范围是100-8191,32位buffer是100-33,554,431。

根据这些定义编辑一个域表文件。

使用mkfldhdr(32)生成域头文件。

编译应用程序,使用生成的头文件和fml.h(fml32.h),链接libfml.a(libfml32.a)。

正确设置环境变量FIELDTBLS(32)和FLDTBLDIR(32)。

 

2.域表文件

文件形式如下:

*base 100

# name       number  type  flags  comments

ACCOUNT_ID  10     long   -      -

ACCT_TYPE   11     char   -       -

ADDRESS     09     string  -       -

AMOUNT      16     float   -      -

文件中以#开头的行被忽略。

文件中以$开头的行也被忽略,但会被拷贝到后面生成的头文件。

文件以*base开头的行指出后面的域号的基本偏移。

每个域有以下部分组成:

· name:域的名字;

· rel-number:域的编号,它是一个相对当前base的数字;

· type:数据类型;

· flag:标志。保留;

· comment:注释。

该文件用来生成头文件,并在函数调用里使用。

 

3.域头文件

与域表文件对应的头文件形式如下:

/* fname fldid */

/* ----- ----- */

#define  ACCOUNT_ID  ((FLDID)8302)

/* number: 110 type: long */

#define  ACCT_TYPE  ((FLDID)16495)

/* number: 111 type: char */

#define  ADDRESS  ((FLDID)41069)

/* number: 109 type: string */

#define  AMOUNT  ((FLDID)24692)

/* number: 116 type: float */

 

4.mkfldhdr(32)工具

mkfldhdr(mkfldhdr32)工具将环境变量FIELDTBLS指定的域表文件对应生成一个C头文件,头文件的命名是在域表文件名后加后缀(.h)。缺省目标文件放在当前目录下,可以指定选项-d来指定生成的头文件存放位置。

使用举例:

FLDTBLDIR=/project/fldtbls; export FLDTBLDIR

FIELDTBLS=maskftbl,DBftbl,miscftbl; export FIELDTBLS

mkfldhdr maskftbl

mkfldhdr DBftbl

mkfldhdr miscftbl

 

5.环境变量

FIELDTBLS(FIELDTBLS32):以逗号分隔每个域表文件;

FLDTBLDIR(FLDTBLDIR32):以冒号分隔域表文件存放的路径列表。

注意列表中间不能插入空白字符。

 

6.Falloc(Falloc32)

使用malloc动态分配fielded buffer的存储空间并调用Finit进行初始化。

#include <stdio.h>

#include <fml.h>

FBFR *Falloc(FLDOCC F, FLDLEN V);

#include <fml32.h>

FBFR32 *Falloc32(FLDOCC32 F, FLDLEN32 V);

参数分别是域的个数和空间的字节数。

失败时返回NULL并设置全局变量Ferror。

失败原因:

· FMALLOC:malloc失败;

· FEINVAL:参数非法。

注意:该函数分配的空间只用于内部处理,不能用于tpcall()和tpacall()。

 

7.Fsizeof(Fsizeof32)

返回给定的FML buffer的大小。

long Fsizeof(FBFR *fbfr);

long Fsizeof32(FBFR32 *fbfr32);

参数说明:

fbfr:buffer指针。

 

8.Fneeded(Fneeded32)

计算buffer需要的空间大小。

#include <stdio.h>

#include <fml.h>

long Fneeded(FLDOCC F, FLDLEN V);

#include <fml32.h>

long Fneeded32(FLDOCC32 F, FLDLEN32 V);

失败返回-1。

失败原因:

FEINVAL:非法参数。

 

9.Finit(Finit32)

用于清除一个存在FML buffer的内容以便重新使用它。对于使用Falloc和tpalloc分配的buffer该函数不是必须的。

int Finit(FBFR *fbfr, FLDLEN buflen);

int Finit32(FBFR32 *fbfr, FLDLEN32 buflen);

参数说明:

bffr:要处理的buffer指针;

buflen:清理的空间字节数。

使用举例:

FBFR * fbfr;

fbfr = (FBFR *) tpalloc(“FML”,NULL,Fneeded(5,200));

...

Finit(fbfr,Fsizeof(fbfr));

 

10.Fadd(Fadd32)

往buffer中的某个域填值,同一个域可以填多次,按下标0、1,2…依次存放。

int Fadd(FBFR *fbfr, FLDID fieldid, char *value, FLDLEN len);

int Fadd32(FBFR32 *fbfr, FLDID32 fieldid, char *value, FLDLEN32 len);

参数说明:

fbfr:FML buffer指针;

fieldid:域ID号;

value:值存放的地址(char *类型)。当数据不是string或carray时要强制转化;

len:域长度。只对carray类型有效。

失败返回-1。

使用举例:

long db_id;

...

(void)Fadd(reqfb, ACCOUNT_ID, (char *)&db_id, (FLDLEN)0);

char *t_amts;

...

if (Fadd(reqfb, SAMOUNT, t_amts, (FLDLEN)0) == -1)

    (void)printf(“Fadd failed with error: %d\n”, Ferror);

char *t_amts;

...

if (Fadd32(reqfb, SAMOUNT, t_amts, (FLDLEN32)0) == -1)

    (void)printf(“Fadd32 failed with error: %d\n”, Ferror32);

 

11.Fchg(Fchg32)

修改域的值。

int Fchg(FBFR *fbfr, FLDID fieldid,int occ, char *value, FLDLEN len);

int Fchg32(FBFR32 *fbfr, FLDID32 fieldid,int occ, \

        char *value, FLDLEN32 len);

参数说明:

fbfr:FML buffer指针;

fieldid:域ID号;

occ:域的下标。从0开始计算,-1表示增加值;

value:值的地址(char *);

len:域长度。只对carray类型有效。

失败返回-1。

若域指定下标当前没有值,则增加该下标的值。

使用举例:

char *t_amts;

...

if (Fchg(reqfb,SAMOUNT, 0, t_amts,(FLDLEN)0) == -1)

    (void)printf(“Fchg failed with error: %s”,Fstrerror(Ferror));

 

12.Fget(Fget32)

取域的值。

int Fget(FBFR *fbfr, FLDID fieldid,int occ, char *value, FLDLEN *maxlen);

int Fget32(FBFR32 *fbfr, FLDID32 fieldid,int occ, \

        char *value, FLDLEN32 *maxlen);

参数说明:

fbfr:FML buffer指针;

fieldid:域ID号;

occ:域的下标。从0开始计算,-1表示增加值;

value:存放地址(char *);

maxlen:最大长度的指针,返回时被置为实际长度。

失败返回-1。

若当前空间不足以存放实际的值,函数并不截断数据,而是返回-1。

使用举例:

FLDLEN len2;

long amount;

. . .

len2 = sizeof(amount);

(void)Fget(transf, MID_INIT, 3, (char *) &amount, &len2);

 

13.Fcpy(Fcpy32)

进行FML buffer的拷贝。

int Fcpy(FBFR *dest, FBFR *src);

int Fcpy32(FBFR32 *dest, FBFR32 *src);

失败返回-1。

函数认为两者都是FML buffer,当目标buffer足够大时进行复制。

 

14.输入/输出函数

int Fprint(FBFR *fbfr);

int Fprint32(FBFR32 *fbfr);

以可读形式打印FML buffer的内容,输出到标准输出。

int Ffprint(FBFR *fbfr, FILE *iop);

int Ffprint32(FBFR32 *fbfr, FILE *iop);

同上,但输出到指定的流中。

int Fextread(FBFR *fbfr, FILE *iop);

int Fextread32(FBFR32 *fbfr, FILE *iop);

从流中读取数据到buffer中。

参数说明:

fbfr:buffer指针;

iop:输入/输出流。

格式的说明见ud部分的说明。

 

15.Fvftos(Fvftos32)

把FML buffer的数据拷贝到VIEW C结构中。

int Fvftos(FBFR *fbfr, char *cstruct, char *view);

int Fvftos32 (FBFR32 *fbfr, char *cstruct, char *view);

参数说明:

fbfr:要拷贝的FML buffer指针;

cstruct:指向C结构数据的指针;

view:VIEW名称。

若FML中的域在结构中没有对应的项,则忽略。对于多记录的域,相应结构的域要是一个数组,如果buffer中的记录数小于结构中域数组的个数,则结构中多余部分置为null值。如果buffer记录数大于数组个数,则多余的值被忽略。

 

16.Fvstof(Fvstof32)

把VIEW结构中的数据拷贝到FML buffer中。

int Fvstof(FBFR *fbfr, char *cstruct, int mode, char *view);

int Fvstof32(FBFR32 *fbfr, char *cstruct, int mode, char *view);

参数说明:

fbfr:FML buffer地址;

struct:C结构数据地址;

mode:拷贝模式。有以下可选值:

· FJOIN:把结构和FML buffer匹配的域中结构的值拷贝到结果buffer中;

· FOJOIN:执行FJOIN功能之外,也把FML buffer中其他内容拷贝到结果buffer 中;

· FUPDATE:执行FJOIN功能之外,也把FML buffer和结构的其他内容拷贝到结果buffer中;

· FCONCAT:把结构和FML buffer的全部内容都拷贝到结果buffer中。

view:VIEW名称。

 

 

八、    开发环境

1.使用buildclient构造client端程序

步骤:

1.  client端程序包含atmi.h头文件;

2.  正确设置TUXDIR环境变量;

3.  使用buildclient工具编译程序;

buildclient的语法如下:

buildclient [-v] [-C] -o executable -f first-file [-f first-file]... \

        [-l last-file]...

选项含义:

-C:编译COBOL代码;

-o:可执行文件的名字;

-f option:在链接tuxedo库之前处理该文件;

-l option:在链接tuxedo库之后处理该文件;

-v:打印实际的编译命令行。

buildclient在运行中使用下面的环境变量:

CFLAGS:自动在该变量中增加"-I${TUXDIR}/include";

CC:使用该变量指向的编译器。

 

2.使用tmloadcf

tmloadcf用于将tuxedo文本配置文件转化为运行时需要的二进制文件。

二进制文件的文件名由环境变量TUXCONFIG指定,该文件名必须是绝对路径的。

tmloadcf的语法如下:

tmloadcf [option] text-file;

选项有如下几个:

-c:计算该配置需要的IPC资源而不生成目标文件;

-n:进行语法检查而不生成目标文件;

-b:限制目标文件的大小;

-y:不提示直接覆盖现有的目标文件;

 

3.使用tmunloadcf

tmunloadcf将二进制配置文件以ASCII形式输出。

 

4.使用tmboot

tmboot启动tuxedo应用服务,创建必要的IPC资源。

有如下选项,无选项时启动所有配置的服务:

-A:只启动所有机器的管理server(BBL、DBBL);

-g grpname:只启动指定group的server;

-i srvid:只启动指定的server ID的所有server;

-S:启动所有应用server;

-s servername:启动指定的server;

-c:只计算最小的IPC资源需求。

 

5.使用tmshutdown

tmshutdown停止tuxedo服务,必要是删除相关的IPC资源。

有如下选项:

-A、-g、-i、-S、-s:与tmboot相同;

-R:在多机环境下停止除BB外的服务;

 

6.使用buildserver构造server端程序

语法如下:

buildserver [-o executable]...

[-v] \

[-s service2, service3:func] \

[-f source/object]...\

[-l object] ... \

[-r resource manager]

选项含义:

-o:生成的可执行程序名;

-v:打印实际的编译命令行;

-s:指定提供的service和对应的处理函数;

-f:在链接tuxedo库之前处理该文件;

-l:在链接tuxedo库之后处理该文件;

-r:要链接相关资源库(在$TUXDIR/udataobj/目录下)。

 

 

九、    配置文件

tuxedo的运行需要配置文件UBBCONFIG,该文件由管理员编写,然后使用tmloadcf编译成二进制文件。它有以下几个部分组成:

 

1.RESOURCES

该部分包括整个应用系统的一些配置信息,必须存在而且是配置文件的第一部分。有如下几个参数:

(1).IPCKEY(必需)

用于指定tuxedo分配和存取IPC资源的key,范围是32,768到262,143,该值在系统是唯一的,不能和别的应用同时使用这个值。

(2).MASTER(必需)

指定系统的主节点,主节点控制着整个应用系统的启动和管理。它的值是一个Logical Machine Identifier(LMID),LMID在后面的MACHINES定义。当主节点是集群时,需要指定两个LMID。

(3).UID、GID、PERM

指定系统的存取权限。UID和GID是tuxedo管理员的用户id和组id,PERM是一个八进制数指定读写权限。

(4).MAXACCESSERS、MAXSERVERS、MAXSERVICES

MAXACCESSERS:指定能连接到tuxedo一个节点的最大进程数。缺省是50,这包括所有的client、server和管理进程BBL等。增加该值将会消耗更多的系统信号量IPC资源。

MAXSERVERS:整个应用系统中最大的server进程数。包括管理server进程,缺省是50。提高该值需要共享内存资源。

MAXSERVICES:整个系统可以发布的service的最大数量。缺省是100。提高该值需要更多的共享内存资源。一个service可以被多个server发布,此时,它的数量要算多份。

(5).MODEL(必需)

有两个可选值:

· SHM:应用运行在单机或多机下,使用全局共享内存;

· MP:不使用共享内存,运行在网络多机环境下。

(6).OPTIONS

有两个可选值:

· LAN:支持网络;

· MIGRATE:支持server集群。

可同时指定这两个值,用逗号分隔。

(7).LDBAL

是否打开load balancing(负载均衡)功能。可设置为Y或N,缺省为N。

(8).NOTIFY

设置client接收unsolicited message(请求消息)的方法。有如下三个可选值:

· IGNORE:client忽略此类消息;

· DIPIN:当client调用tpchkunsol或其他ATML调用时接收此类消息;

· SIGNAL:通过系统产生信号通知client接收消息。有两个信号可以产生:SIGUSR1和SIGUSR2,缺省是SIGUSR2。若要指定为SIGUSR1则需设置下面的USIGNAL参数。

缺省是DIPIN。

(9).USIGNAL

设置系统产生的信号是SIGUSR1还是SIGUSR2。

(10).SCANUNIT、SANITYSCAN、BLOCKTIME

管理server(BBL)定期对所属机器上的servers进行正常检测。下面是有关的设置。

· SCANUNIT:指定检测粒度。单位是秒,值必须是5的倍数。缺省是10。

· SANITYSCAN:在两次检测之前间隔几个SCANUNIT。缺省是12(120秒)。SANITYSCAN*SCANUNIT不能大于300。

· BLOCKTIME:一个消息超时前可阻塞的SCANUNIT。缺省是6(60秒)。BLOCKTIME*SCANUNIT不能超过32767。

 

2.MACHINES

该部分包括整个应用系统中所有计算机的信息。在配置文件中必须存在,而且是第二部分。

每个主机有如下的属性:

(1).主机名

使用命令”uname –n”获得的名称。

(2).LMID(必需)

主机的逻辑id:logical identifier of the machine(LMID)。

(3).TUXCONFIG(必需)

配置文件所在的绝对路径(最大64字符)。

(4).TUXDIR(必需)

Tuxedo的安装绝对目录(最大64字符)。

(5).APPDIR(必需)

应用server所在的绝对目录(最大64字符)。

(6).ENVFILE

环境文件所在绝对路径(最大64字符)。

(7).ULOGPFX

用户日志文件的绝对路径和前缀。

其他

UID、GID、PERM、MAXACCESSERS、MAXCONV可以在此定义而覆盖RESOURCES部分对该计算机的定义。

 

3.GROUPS

该部分包括所有server组的定义。每台机器必须至少定义一个组。每个组有如下属性:

(1).组名

(2).GRPNO(必需)

组名对应的组号,它必须是唯一的数字。

(3).LMID(必须)

该组属于的逻辑主机id。

 

4.SERVERS

该部分包括所有server的信息。每个条目描述一个server。Server有如下属性:

(1).server名

server可执行程序名(用buildserver编译)。

(2).SRVGRP(必需)

该server所属的group id(在GROUPS定义)。

(3).SRVID(必需)

每个server在group里定义一个唯一的id号。

对于同一个可执行程序可以在SERVERS中有多个条目,即server名不是唯一的。

(4).CLOPT

指定传递给程序的命令行选项。命令行串由”--"分隔,之前的部分由标准main()处理,后面的部分(有的话)由tpsvrinit()处理,用户自定义的选项放在此处。

缺省CLOPT=“-A”,表示发布该server所有的services。

部分选项如下:

-e filename:重定向标准出错文件(缺省是$APPDIR/stderr);

-o filename:重定向标准输出文件(缺省是$APPDIR/stdout);

-p [L][low_water][,[terminate_time]][:[high_water][,create_time]]:允许server的动态伸缩;

-s services:发布特定的services(语法同buildserver)。该部分优先于buildserver;

-r:记录services的统计信息和标准错误。

(5).ENVFILE

每个server也可指定环境文件,它与MACHINES定义的ENVFILE都起作用,相同的变量以server的为主。

(6).RQADDR、RQPERM、REPLYQ、RPPERM

RQADDR:起用MSSQ(Multiple Server Single Queue)集合。指定一个名字,集合中其他server用同样的名字。

RQPERM:指定队列的访问权限(如0666)。

REPLYQ:属于MSSQ中server的service从队列中取消息的话,它必须回应该消息,这通过指定REPLYQ=Y完成。缺省REPLYQ=N。

RPPERM:当REPLYQ=Y时,指定相关权限。

(7).CONV

如果server是一个会话server,则该属性必须指定为Y。缺省是N,表示它不是一个会话server。

(8).SEQUENCE

指定server的启动顺序,范围是1-9,999。该值小的先于值大的启动;指定该值的server比没有指定的server先启动;如果server都没有指定该选项,则按定义的顺序启动。

server终止时按照启动的反序停止。

(9).MIN

指定启动server的最小实例数。缺省为1。

(10).MAX

指定server能启动的最大实例数。缺省等于MIN。

(11).RESTART、RCMD、MAXGEN、GRACE

RESTART:指定当server死后是否重新启动它。当RESTART=Y时,下面的选项有用。

RCMD:指定重启时同时执行的命令,它必须是一个可执行文件。

MAXGEN:在GRACE时间范围内能重启的次数(MAXGEN-1)。如果GRACE=0则表示重启没有限制。

GRACE:值必须大于等于0,小于等于2,147,483,647秒(大概70年)。缺省是24小时。

 

5.SERVICES

该部分包括应用中的所有service的信息。每个service一个条目。有如下属性:

(1).LOAD

当LDBAL为Y时,指定该service的负载因子。缺省是50。

(2).PRIO

指定service的优先级。缺省是50。值越大级别越高。

(3).SRVGRP

(4).BUFTYPE

 

 

十、    Workstation C/S配置

1.Workstation client

(1).编程

client使用ATMI的编程方法不变。

对于buildserver,多指定一个选项:

-w:指定链接WS库而不是native库。

(2).设置环境变量

TUXDIR:tuxedo软件的安装目录;

WSNADDR:指定WSL的网络地址,它必须要和服务端配置的WSL设置一样;

下面的环境变量不是必须的:

WSDEVICE:用于TLI的网络设备。缺省为空串;

WSENVFILE:指定环境变量文件;

WSTYPE:指定机器类型。如果类型与WSL所属的机器的类型匹配,则不进行encoding/decoding。缺省为空串;

WSRPLYMAX:应用回应的缓存大小。缺省是32,000字节;

TMPDIR:当WSRPLYMAX的限制到达时,存储新回应数据的目录。缺省是工作目录;

APP_PW:应用密码。

 

2.配置文件UBBCONFIG

(1).设置MAXWSCLIENTS

在MACHINES部分增加该设置,指定最大的可连接client数目。缺省为0,表示不能连接。形式:

MAXWSCLIENTS=number

(2).增加WSL server

在SERVERS部分增加WSL(Workstation Listener),它的定义方法与普通server一样。命令行的选项如下(在CLOPT中”--"之后):

-n netaddr:指定网络地址,多个地址用逗号分隔;

-d device:网络设备,用于TLI;

-t timeout:指定client连接超时,该值是SCANUNIT的倍数。缺省值对不需安全的应用是3,对安全的应用是6;

-w name:指定与该listener对应的要启动的WSH(Workstation Handler)的名字。缺省是WSH;

-m number:指定最小应启动的处理进程数。缺省是0;

-M number:指定最大启动的处理进程数。缺省等于MAXWSCLIENTS的值;

-x number:WSH同时能处理的client数。缺省值是10;

-T inactive-client-timeout:当client在指定时间没有请求时,WSH将断开与client的连接,单位是分钟。不指定该选项则不超时;

-p miniwshport:与listener相关的WSHs能使用的最小端口号,范围是0-65535。缺省是2048;

-p maxwshport:与listener相关的WSHs能使用的最大端口号,范围是0-65535。缺省是65535;

-c compression-threshold:进行报文压缩的最大限度。缺省值是2,147,483,647;

-k compression-threshold:同上,出现于tuxedo来版本;

-z [0|40|128]:用于安全设置,建链时的密钥长度;

-Z [0|40|128]:用于安全设置(LLE),建链时的密钥长度。

 

3.示例

*MACHINES

SITE1

. . .

MAXWSCLIENTS=150

. . .

SITE2

. . .

MAXWSCLIENTS=0

. . .

*SERVERS

. . .

WSL SRVGRP=”BANKB1” SRVID=500 RESTART=Y \

        CLOPT=”-A -- -n //train4:32000 -d /dev/tcp -m 5 -M 30 -x 5”

 

 

十一、        tuxedo安全机制

Tuxedo提供四个级别的安全认证机制。分别介绍如下:

 

1.无认证(基于本地操作系统的认证)

基于UNIX的系统在访问tuxedo的相关资源时都需要相应的权限,该级别的认证使用了操作系统的功能,tuxedo本身不做额外处理。

在配置文件UBBCONFIG中不需要增加任何处理。

也可指定如下的参数进行更具体的设置:

在RESOURCE中指定SECURITY的值为NONE;指定UID、PID、PERM来代替操作系统的缺省设置。如:

SECURITY  NONE

 

2.密码认证

这是基于整个应用系统的认证,要访问该应用系统都必须提供一个相同的密码。

使用该级别的方法如下:

在UBBCONFIG的RESOURCE部分指定认证级别:

SECURITY  APP_PW

当调用tmloadcf时,tuxedo会提示输入一个密码。该密码可以在tmadmin中使用passwd命令进行修改。

此时client端调用tpchkauth()时会返回TPSYSAUTH。

client要加入应用,必须使用tpalloc分配一个TPINIT结构,在该结构中的passwd域填入上面的密码,然后调用tpinit()才会成功。

如:

...

TPINIT *tpinfo;

char *passwd;

tpinfo = (TPINIT*) tpalloc(“TPINIT”, NULL, TPINITNEED(0));

/*prompt for user password*/

strcpy(tpinfo -> passwd, passwd);

tpinit(tpinfo);

...

 

3.用户认证server

使用认证server,由用户实现一个用于认证的service,该service决定具体的认证方法。

使用该级别认证的方法如下:

在UBBCONFIG的RESOURCE部分指定认证级别和认证的service:

SECURITY  USER_AUTH

AUTHSVC   MYSVC

在SERVER部分指定包含认证service的相应server:

MYAUTHSVR SRVID=100 CLOPT=“-A” SRVGRP=GROUP1

具体的例子见TUXDIR/lib/AUTHSVC.c。它检查tpinit结构的username、cltname、passwd并返回一个认证的key。

 

4.ACLs

Access Control Lists(ACLs)是tuxedo自己提供一套基于组管理的认证机制。该机制由用户、组以及对资源(service、event等)的相应存取权限组成。

使用该级别认证的方法如下:

在RESOURCE部分定义:

SECURITY  ACL 或

MANDATORY_ACL

ACL和ACL或MANDATORY_ACL的区别是:若当前要访问的对象没有定义存取规则,则ACL方式允许访问,而MANDATORY_ACL方式不允许访问。如:

*RESOURCES

SECURITY  ACL /* or */

MANDATORY_ACL

AUTHSVC “..AUTHSVC”

*SERVERS

AUTHSVR SRVID=100 SRVGRP=AdminGroup RESTART=Y CLOPT=”-A”

该方法要涉及文件tpusr、tpgrp和tpacl,在$APPDIR目录下。使用如下命令处理用户:

tpusradd;

tpusrdel;

tpusrmod;

使用如下命令处理组:

tpgrpadd;

tpgrpdel;

tpgrpmod;

使用如下命令处理对象的存取权限:

tpacladd;

tpacldel;

tpaclmod;

如:

tpgrpadd -g 801 Beatles

tpusradd -g Beatles Ringo

tpusradd -g Beatles John

tpusradd -g Beatles George

tpusradd -u 9 Paul

tpacladd -g Beatles -t SERVICE TOUPPER

 

 

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
The ATML Toolkit adds functionality to TestStand for translating an ATML Test Description (TD) file to a TestStand sequence file and LabVIEW and LabWindows/CVI code modules. 更多NI资源: LabWindows/CVI 2019 and Drivers (MD5) c5d5d45807dac78d6f0ede4594f97ffe (SHA256) 3526f827bc9b894677cf2206cec12d34b091f0d453c3162f77b6e272e3e59023 LabWindows/CVI 2019 Runtime (MD5) 4837aa6a64014b386252c12daf702c01 (SHA256) eea9dacbacf1e7a36dc68ec379e4c6bd3ae3f1ef78fea826d7edfba399f9ee9f LabVIEW NXG 3.1 and Drivers (MD5) 1589dd3da20160deb1d27c8f8b8c10dc (SHA256) 31462f6d7298d947ec988299c65a22232e4366218f9b797254693a7410daa1af LabVIEW NXG 3.1 Runtime (MD5) 84e5c321c58e397846b7b718024e6086 (SHA256) 0c52aa7ef5e6fa79d50f37dd976faff8e18bf031fdc6a55395ebbdadaa5529d2 LabVIEW 2019 and Drivers (MD5) 2c792f957b6bcf5262654bea41842970 (SHA256) 1f156d7465eb64d218639f2bd7847bd02a5338ee1f0981f22205688b9e5f9f8d LabVIEW 2019 Runtime (MD5) eb149919844c8dd00c8eebd61e349c67 (SHA256) 5d9506f42c025351a870846559a79bcd4ce4a56ad84ff898cc3c2fa1b98c42c0 TestStand ​2019 (MD5) 2c0a366160000f9451f064c6b95bc37b (SHA256) 6f660bcb5daa63d4c4caf82fb6d0940d632b87ee0b3e78b89182ec3c43263f8a TestStand 2017 ATML工具包 (MD5) 8ad58a58078e9ed2bbcc85624d4226ac (SHA256) 5fe4f24dde497234049f6593c9e1da6bc9a9fc64f8828eb560a6580ba8eaa728 Measurement Studio 2019 and Drivers (MD5) 7a00e9b8ecfa92b5d7e33b18f01d5800 (SHA256) c5844236ae76ccf4130be2f0535376134d7ad0e734ae4004759849dbbfa5ec21 VeriStand 2019 (MD5) c25ec6439b3cc1515242518ca999aa10 (SHA256) 5a5a32522f4af1c5e36eec126b9f0f5cf3bc8f38899b415b082ec7011e754599 Switch Executive 2019 (MD5) 3549593d426a4f1dbda0d8f2e1686957 (SHA256) 8bf23a1dbd7d49ffadfa56837a8be76153edf3982573ede2327864e3a6e466d5 SystemLink 19.0 (MD5) 029945c622d3ad58951476b82ab187da (SHA256) 137e3e8a007ee3cb86a170e82db0166c690a6d229970f87385fa94e94ace832e FlexLogger 2019 R3 (MD5) f4f4f8d7ce7bac7c09c03b33fae082ea (SHA256) 649c125591f561bc1a4eb532234e3150f475dda30c2a9aaac8c2651dd852add2 DIAdem 2019 (MD5) ce8777e40f92220705f0345ecacf0458 (SHA256) b335abbf0ff50dff1de02c21f4eebc85a46ead11940dddccaac281ee1f4c49a6 自动化检测视觉生成器2018 SP1 (MD5) a79cd1a7dde725f5b6e9570ae75bef1e (SHA256) 3fd3022b6fbf0dd98438de9160a8218712ed31eb007d6179a73cb174cbaeb01e 视觉开发模块2019 (MD5) 91d21215e5e4e0ef92393b2b3578e4fa (SHA256) 44534d85d4303e2b99b4a79af4001192c05b5f3ce0a664f1586b7fada6654201 NI Package Builder 19.0 (MD5) a00082ebacdb8a12c1e408de8c860b4c (SHA256) 8c71e06005db9f9010399cd180a89db7a7e7514856d2bb44cc58f4ad433a6007 InsightCM 3.5 (MD5) 0270e2c2809efd61d8b280524c91f147 (SHA256) 5940b3ab6d518cf2269ab6a0892daef4354798359bb1fe8ac921b917b1810cee InsightCM软件开发包3.5 (MD5) 797324d2148a52be13070c08ffc34aad (SHA256) 37b7e1cdff3bed101efb6f7814906f2ef67d882fdef297fd851498ca26eeb17e Requirements Gateway 2018 (MD5) 7329960796a897d17dfd21208da148af (SHA256) fed690aff9fbd7872e826745fa6c11230047f0272b51f42bcfd9fbbcfd72cdae LabVIEW 2019单元测试架构工具包 (MD5) 37163fcd5dcf765fafa98eb15bb6f0a0 (SHA256) ad2538d21e64ca065a2dffec698f04ed9a891a98c9f8607a42c0011be4d8a621 软件平台套件(2019年春季版) 2019 (MD5) 683574a835ba6959eb7a59f61fa30681 (SHA256) 92079f9ca65a63d1ae42287116964e81b6d4fbfdbaedb0197e63c970102f1aac Automated Test Software Suite 2​019年春季版 (MD5) fcbe19a54aa33ca8e913ab33fd0e9aa5 (SHA256) 5806e2bc901b5d0f959def7aa9f00e93a3e776bdf442c502a7c53e92e97db5a4 电路设计套件14.2专业版 (MD5) 85289db945bfa7d2236bf2571634a064 (SHA256) d9f3560528e8ea7d87889ca6bbb64e18a69c2325959eaab28bad842f7d58970f LabVIEW通信系统设计套件3.1 (MD5) fd09e578e06ed11d79838228d184806c (SHA256) 62e0abf24495ba631fada9dd907d362140ce6a2c77683fa30e09492ced9dab21 Embedded Control and Monitoring Software Suite 2019年春季版 (MD5) 6dae04b4209fb602d55ef950c94936fc (SHA256) cd29d4dfbb9783e72d19780b4ba715b858d6f6a3b233dc1e8d8706bc8dfdf2ef HIL and Real-Time Test Software Suite 2018年秋季 (MD5) 64BAE665E1F080CF111ED65853A1574E (MD5?) 5c04875c51ac82f16044b9e76f7e26b2

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值