pgrp
pid_t pgrp; /* process group of this job */
pid_t pgrp;
pgrp = jp->ps[0].pid;
tcsetpgrp(ttyfd, pgrp);
pid_t pgrp;
pgrp = getpid();
pgrp = jp->ps[0].pid;
if (setpgid(0, pgrp) == 0 && mode == FORK_FG &&
if (tcsetpgrp(ttyfd, pgrp) < 0)
pgrp = pid;
pgrp = jp->ps[0].pid;
setpgid(pid, pgrp);
tcsetpgrp(int fd, pid_t pgrp)
s = pgrp;
struct pgrp pgrp;
struct pgrp tpgrp;
if (KREAD(kd, (u_long)proc.p_pgrp, &pgrp)) {
proc.p_pgrp = &pgrp;
if (KREAD(kd, (u_long)pgrp.pg_session, &sess)) {
pgrp.pg_session);
pgrp.pg_session = &sess;
killpg(pid_t pgrp, int sig)
return kill(pgrp, sig);
static struct pgrp pgrp0;
struct pgrp *pgrp;
pgrp = sigio->sio_pgrp;
lwkt_gettoken(&pgrp->pg_token);
SLIST_REMOVE(&pgrp->pg_sigiolst, sigio, sigio, sio_pgsigio);
lwkt_reltoken(&pgrp->pg_token);
pgrel(pgrp);
struct pgrp *pgrp = NULL;
pgrp = pgfind(-pgid);
if (pgrp == NULL) {
if (pgrp->pg_session != curproc->p_session) {
KKASSERT(pgrp == NULL);
lwkt_gettoken(&pgrp->pg_token);
SLIST_INSERT_HEAD(&pgrp->pg_sigiolst, sigio, sio_pgsigio);
sigio->sio_pgrp = pgrp;
lwkt_reltoken(&pgrp->pg_token);
pgrp = NULL;
if (pgrp)
pgrel(pgrp);
struct pgrp *p1grp;
struct pgrp *plkgrp;
struct pgrp *pgrp;
pgrp = p->p_pgrp;
sess = pgrp ? pgrp->pg_session : NULL;
if (pgrp) {
kp->kp_pgid = pgrp->pg_id;
kp->kp_jobc = pgrp->pg_jobc;
struct pgrp *pg;
KKASSERT(pgrp->pg_refs > 0);
lwkt_reltoken(&pgrp->pg_token);
orphanpg(struct pgrp *pg)
struct pgrp *pg;
static void orphanpg(struct pgrp *pg);
struct pgrp *pgrp;
LIST_FOREACH(pgrp, &prg->allpgrp, pg_list) {
(void *)pgrp, (long)pgrp->pg_id,
(void *)pgrp->pg_session,
pgrp->pg_session->s_count,
(void *)LIST_FIRST(&pgrp->pg_members));
LIST_FOREACH(p, &pgrp->pg_members, p_pglist) {
SYSCTL_KERN_PROC_ALLFLAGS(KERN_PROC_PGRP, pgrp);
pgrpinsertinit(struct pgrp *pg)
pgref(struct pgrp *pgrp)
refcount_acquire(&pgrp->pg_refs);
pgrel(struct pgrp *pgrp)
n = PGRP_HASH(pgrp->pg_id);
count = pgrp->pg_refs;
if (atomic_cmpset_int(&pgrp->pg_refs, 1, 0))
if (atomic_cmpset_int(&pgrp->pg_refs, count, count - 1))
LIST_REMOVE(pgrp, pg_list);
if (pid_doms[pgrp->pg_id % PIDSEL_DOMAINS] != (uint8_t)time_second)
pid_doms[pgrp->pg_id % PIDSEL_DOMAINS] = (uint8_t)time_second;
funsetownlst(&pgrp->pg_sigiolst);
if (pgrp->pg_session->s_ttyp != NULL &&
pgrp->pg_session->s_ttyp->t_pgrp == pgrp) {
pgrp->pg_session->s_ttyp->t_pgrp = NULL;
sess_rele(pgrp->pg_session);
kfree(pgrp, M_PGRP);
struct pgrp *
struct pgrp *pgrp;
LIST_FOREACH(pgrp, &prg->allpgrp, pg_list) {
if (pgrp->pg_id == pgid) {
refcount_acquire(&pgrp->pg_refs);
return (pgrp);
struct pgrp *pgrp;
struct pgrp *opgrp;
pgrp = pgfind(pgid);
KASSERT(pgrp == NULL || !mksess,
if (pgrp == NULL) {
pgrp = kmalloc(sizeof(struct pgrp), M_PGRP, M_WAITOK | M_ZERO);
pgrp->pg_id = pgid;
LIST_INIT(&pgrp->pg_members);
pgrp->pg_jobc = 0;
SLIST_INIT(&pgrp->pg_sigiolst);
lwkt_token_init(&pgrp->pg_token, "pgrp_token");
refcount_init(&pgrp->pg_refs, 1);
lockinit(&pgrp->pg_lock, "pgwt", 0, 0);
kfree(pgrp, M_PGRP);
pgrp->pg_session = sess;
pgrp->pg_session = p->p_session;
sess_hold(pgrp->pg_session);
LIST_INSERT_HEAD(&prg->allpgrp, pgrp, pg_list);
} else if (pgrp == p->p_pgrp) {
pgrel(pgrp);
lwkt_gettoken(&pgrp->pg_token);
p->p_pgrp = pgrp;
LIST_INSERT_HEAD(&pgrp->pg_members, p, p_pglist);
fixjobc(p, pgrp, 1);
lwkt_reltoken(&pgrp->pg_token);
struct pgrp *pg = p->p_pgrp;
fixjobc(struct proc *p, struct pgrp *pgrp, int entering)
struct pgrp *hispgrp;
lwkt_gettoken(&pgrp->pg_token);
mysession = pgrp->pg_session;
if ((hispgrp = p->p_pptr->p_pgrp) != pgrp &&
pgrp->pg_jobc++;
else if (--pgrp->pg_jobc == 0)
orphanpg(pgrp);
if ((hispgrp = np->p_pgrp) != pgrp &&
struct pgrp *pg = NULL;
struct pgrp *pgrp = NULL; /* target pgrp */
if ((pgrp = pgfind(pgid)) == NULL ||
pgrp->pg_session != curp->p_session) {
if (pgrp)
pgrel(pgrp);
struct pgrp *pg;
struct pgrp *pg;
struct pgrp *pg;
struct pgrp *pg;
struct pgrp *pg = sigio->sio_pgrp;
struct pgrp *pgrp;
pgrp = cp->p_pgrp;
pgref(pgrp);
pgrp = pgfind(pgid);
if (pgrp == NULL)
lockmgr(&pgrp->pg_lock, LK_EXCLUSIVE);
LIST_FOREACH(p, &pgrp->pg_members, p_pglist) {
lockmgr(&pgrp->pg_lock, LK_RELEASE);
pgrel(pgrp);
struct pgrp *pgrp;
if (pgid && (pgrp = pgfind(pgid)))
pgsignal(pgrp, sig, 0);
pgsignal(struct pgrp *pgrp, int sig, int checkctty)
if (pgrp) {
pgref(pgrp);
lockmgr(&pgrp->pg_lock, LK_EXCLUSIVE);
LIST_FOREACH(p, &pgrp->pg_members, p_pglist) {
lockmgr(&pgrp->pg_lock, LK_RELEASE);
pgrel(pgrp);
struct pgrp *pgrp = pgfind(pgid);
if (pgrp == NULL || pgrp->pg_session != p->p_session) {
if (pgrp)
pgrel(pgrp);
tp->t_pgrp = pgrp;
struct pgrp *pgrp;
if ((pgrp = tp->t_pgrp) == NULL) {
pgref(pgrp);
lwkt_gettoken(&pgrp->pg_token);
for (p = LIST_FIRST(&pgrp->pg_members);
lwkt_reltoken(&pgrp->pg_token);
pgrel(pgrp);
struct pgrp *opgrp;
struct pgrp *opgrp;
struct pgrp *pg;
struct pgrp *siu_pgrp; /* process group to receive ... */
LIST_ENTRY(pgrp) pg_list; /* Hash chain. */
struct pgrp *p_pgrp; /* Pointer to process group. */
struct pgrp *pgfind (pid_t); /* Find process group by id w/ref */
void pgref (struct pgrp *); /* Ref pgrp preventing disposal */
void pgrel (struct pgrp *); /* Deref pgrp & dispose on 1->0 trans */
void fixjobc (struct proc *p, struct pgrp *pgrp, int entering);
void pgrpinsertinit(struct pgrp *pg);
struct pgrp;
LIST_HEAD(pgrplist, pgrp);
struct pgrp;
void pgsignal (struct pgrp *pgrp, int sig, int checkctty);
struct pgrp *t_pgrp; /* Foreground process group. */
pgrp = getpgrp();
(pid_t)ctty_pgrp != pgrp)
static pid_t pgrp; /* our process group */
int pgrp = getpid();
(void) ioctl(0, TIOCSPGRP, (char *)&pgrp);
(void) setpgid(pgrp, pgrp);