void procd_ps(void) { proc_p p; #if 0 int i; pgrp_p pg; session_p s; fprintf(stderr,"proc_table: %p, envid: %d\n",proc_table,proc_table->procd_envid); for (i = 0; i < MAXPGRP; i++) { if (!bit_test(proc_table->pgrps_used,i)) continue; pg = &proc_table->pgrps[i]; print_pgrp(pg); } for (i = 0; i < MAXSESSION; i++) { if (!bit_test(proc_table->sessions_used,i)) continue; s = &proc_table->sessions[i]; print_session(s); } fprintf(stderr,"done\n"); #endif p = __pd_pfind(INITPROC); if (p) { ps_get_flags(-1); ps_print_level(-1,NULL); ps_print_level(0,p); } else fprintf(stderr,"COULD NOT FIND PID %d\n",INITPROC); }
/* * Move p to a new or existing process group (and session) */ int enterpgrp(proc_p p, pid_t pgid, int mksess) { register pgrp_p pgrp = pgfind(pgid); #ifdef DIAGNOSTIC if (pgrp != NULL && mksess) /* firewalls */ panic("enterpgrp: setsid into non-empty pgrp"); if (SESS_LEADER(p)) panic("enterpgrp: session leader attempted setpgrp"); #endif { extern int getpid(); dprintf("%d enterpgrp(p %p (pid: %d),pgid %d,mksess %d) (pgrp = %p pgid: %d)\n", getpid(),p,p ? p->p_pid : -1,pgid,mksess, pgrp,pgrp ? pgrp->pg_id : -1); } if (pgrp == NULL) { pid_t savepid = p->p_pid; proc_p np; /* * new process group */ #ifdef DIAGNOSTIC if (p->p_pid != pgid) panic("enterpgrp: new pgrp and pid != pgid"); #endif if ((np = __pd_pfind(savepid)) == NULL || np != p) return (ESRCH); pgrp = pgrp_alloc(); if (mksess) { session_p sess; /* * new session */ sess = session_alloc(); sess->s_leader = p; sess->s_count = 1; sess->s_ttyp = (struct tty *)0; bcopy(p->p_session->s_login, sess->s_login, sizeof(sess->s_login)); p->p_flag &= ~P_CONTROLT; pgrp->pg_session = sess; } else { pgrp->pg_session = p->p_session; pgrp->pg_session->s_count++; } pgrp->pg_id = pgid; LIST_INIT(&pgrp->pg_members); pgrp->pg_jobc = 0; } else if (pgrp == p->p_pgrp) return (0); /* * Adjust eligibility of affected pgrps to participate in job control. * Increment eligibility counts before decrementing, otherwise we * could reach 0 spuriously during the first call. */ fixjobc(p, pgrp, 1); fixjobc(p, p->p_pgrp, 0); LIST_REMOVE(p, p_pglist); if (p->p_pgrp->pg_members.lh_first == 0) pgdelete(p->p_pgrp); p->p_pgrp = pgrp; LIST_INSERT_HEAD(&pgrp->pg_members, p, p_pglist); return (0); }