Solaris 10 资源管理器开发者指南

资源控制的主观察进程

以下示例是主观察者进程。图 5–3 显示了主观察进程的资源控制。


注 –

换行符在 /etc/project 文件中是无效的。此处显示的换行符仅允许示例显示在列显页或显示页上。/etc/project 文件中的每一项都必须占用单独的一行。


图 5–3 主观察进程

显示主观察进程的资源控制的图

该示例的要点包括以下内容:

rctlblk_t *mlwprcb;

sigset_t smask;



/* Omit return value checking/error processing to keep code sample short */

/* First, install a RCPRIV_BASIC, v=1000, signal=SIGXRES rctl */

mlwprcb = calloc(1, rctlblk_size());	 /* rctl blocks are opaque: */

       rctlblk_set_value(mlwprcb, 1000);

       rctlblk_set_privilege(mlwprcb, RCPRIV_BASIC);

       rctlblk_set_local_action(mlwprcb, RCTL_LOCAL_SIGNAL, SIGXRES);

       if (setrctl("task.max-lwps", NULL, mlwprcb, RCTL_INSERT) == -1) {

           perror("setrctl");

           exit (1);

       }



/* Now, create the thread which waits for the signal */

        sigemptyset(&smask);

        sigaddset(&smask, SIGXRES);

        thr_sigsetmask(SIG_BLOCK, &smask, NULL);

thr_create(NULL, 0, sigthread, (void *)SIGXRES, THR_DETACHED, NULL));



/* Omit return value checking/error processing to keep code sample short */



void *sigthread(void *a)

{

        int sig = (int)a;

        int rsig;

        sigset_t sset;



        sigemptyset(&sset);

        sigaddset(&sset, sig);



        while (1) {

                 rsig = sigwait(&sset);

          if (rsig == SIGXRES) {

              notify_all_children();

              /* e.g. sigsend(P_PID, child_pid, SIGXRES); */

		     }

        }

}