Пример #1
0
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);
}
Пример #2
0
/*
 * 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);
}