pgrp
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)
pid_t pgrp; /* process group of this job */
pgrp = pid;
pgrp = jp->ps[0].pid;
setpgid(pid, pgrp);
if(getpid() == pgrp) {
killpg(pgrp, sig);
pgrp = getpid();
if(setpgid(0, pgrp) < 0)
static pid_t pgrp;
killpg(pid_t pgrp, int sig)
return kill(pgrp, sig);
int tcsetpgrp(int fd, pid_t pgrp)
return (ioctl(fd, TIOCSPGRP, &pgrp));
tcsetpgrp(int fd, pid_t pgrp)
s = pgrp;
struct pgrp pgrp;
if (KREAD(kd, (u_long)proc.p_pgrp, &pgrp)) {
kp->ki_pgid = pgrp.pg_id;
if (KREAD(kd, (u_long)pgrp.pg_session, &sess)) {
pgrp.pg_session);
if (KREAD(kd, (u_long)tty.t_pgrp, &pgrp)) {
kp->ki_tpgid = pgrp.pg_id;
struct pgrp pgrp;
error = kvm_read_all(kd, (unsigned long)proc.p_pgrp, &pgrp,
sizeof(pgrp));
error = kvm_read_all(kd, (unsigned long)pgrp.pg_session, &sess,
pgrp.pg_session, kp->ki_pid);
struct pgrp *pg;
struct pgrp *pg;
struct pgrp *pgrp;
pgrp = p->p_pgrp;
pgrp != NULL ? pgrp->pg_id : 0,
static struct pgrp pgrp0;
struct pgrp *pg;
struct pgrp *pg;
struct pgrp *pgrp;
pgrp = pgfind(-pgid);
if (pgrp == NULL) {
if (pgrp->pg_session != curthread->td_proc->p_session) {
sigio->sio_pgrp = pgrp;
SLIST_INSERT_HEAD(&pgrp->pg_sigiolst, sigio,
PGRP_UNLOCK(pgrp);
struct pgrp *pg;
struct pgrp *pg;
db_print_pgrp_one(struct pgrp *pgrp, struct proc *p)
p->p_pptr == NULL ? 0 : isjobproc(p->p_pptr, pgrp));
struct pgrp *pgrp;
LIST_FOREACH(pgrp, &pgrphashtbl[i], pg_hash) {
pgrp, (int)pgrp->pg_id, pgrp->pg_session,
pgrp->pg_session->s_count,
LIST_FIRST(&pgrp->pg_members));
LIST_FOREACH(p, &pgrp->pg_members, p_pglist)
db_print_pgrp_one(pgrp, p);
static void doenterpgrp(struct proc *, struct pgrp *);
static void orphanpg(struct pgrp *pg);
static void pgdelete(struct pgrp *);
struct pgrp *pgrp;
pgrp = p->p_pgrp;
if (pgrp == NULL)
kp->ki_pgid = pgrp->pg_id;
kp->ki_jobc = pgrp_calc_jobc(pgrp);
sp = pgrp->pg_session;
pgrp_zone = uma_zcreate("PGRP", sizeof(struct pgrp), NULL, NULL,
struct pgrp *pg;
static SYSCTL_NODE(_kern_proc, KERN_PROC_PGRP, pgrp, CTLFLAG_RD | CTLFLAG_MPSAFE,
struct pgrp *
struct pgrp *pgrp;
LIST_FOREACH(pgrp, PGRPHASH(pgid), pg_hash) {
if (pgrp->pg_id == pgid) {
PGRP_LOCK(pgrp);
return (pgrp);
enterpgrp(struct proc *p, pid_t pgid, struct pgrp *pgrp, struct session *sess)
struct pgrp *old_pgrp;
KASSERT(pgrp != NULL, ("enterpgrp: pgrp == NULL"));
PGRP_LOCK(pgrp);
pgrp->pg_session = sess;
pgrp->pg_session = p->p_session;
sess_hold(pgrp->pg_session);
PGRP_LOCK(pgrp);
pgrp->pg_id = pgid;
LIST_INIT(&pgrp->pg_members);
pgrp->pg_flags = 0;
LIST_INSERT_HEAD(PGRPHASH(pgid), pgrp, pg_hash);
SLIST_INIT(&pgrp->pg_sigiolst);
PGRP_UNLOCK(pgrp);
doenterpgrp(p, pgrp);
enterthispgrp(struct proc *p, struct pgrp *pgrp)
struct pgrp *old_pgrp;
PGRP_LOCK_ASSERT(pgrp, MA_NOTOWNED);
KASSERT(pgrp->pg_session == p->p_session,
__func__, pgrp->pg_session, p->p_session, p));
KASSERT(pgrp != p->p_pgrp,
("%s: p %p belongs to pgrp %p", __func__, p, pgrp));
if (!sx_try_xlock(&pgrp->pg_killsx)) {
sx_xlock(&pgrp->pg_killsx);
sx_xunlock(&pgrp->pg_killsx);
doenterpgrp(p, pgrp);
sx_xunlock(&pgrp->pg_killsx);
isjobproc(struct proc *q, struct pgrp *pgrp)
return (q->p_pgrp != pgrp &&
q->p_pgrp->pg_session == pgrp->pg_session);
pgrp_calc_jobc(struct pgrp *pgrp)
if (!mtx_owned(&pgrp->pg_mtx))
LIST_FOREACH(q, &pgrp->pg_members, p_pglist) {
if (isjobproc(jobc_parent(q, NULL), pgrp))
doenterpgrp(struct proc *p, struct pgrp *pgrp)
struct pgrp *savepgrp;
PGRP_LOCK_ASSERT(pgrp, MA_NOTOWNED);
PGRP_LOCK(pgrp);
p->p_pgrp = pgrp;
LIST_INSERT_HEAD(&pgrp->pg_members, p, p_pglist);
if (isjobproc(pp, pgrp))
pgrp->pg_flags &= ~PGRP_ORPHANED;
PGRP_UNLOCK(pgrp);
struct pgrp *savepgrp;
pgdelete(struct pgrp *pgrp)
PGRP_LOCK_ASSERT(pgrp, MA_NOTOWNED);
SESS_LOCK_ASSERT(pgrp->pg_session, MA_NOTOWNED);
funsetownlst(&pgrp->pg_sigiolst);
PGRP_LOCK(pgrp);
tp = pgrp->pg_session->s_ttyp;
LIST_REMOVE(pgrp, pg_hash);
savesess = pgrp->pg_session;
PGRP_UNLOCK(pgrp);
tty_rel_pgrp(tp, pgrp);
proc_id_clear(PROC_ID_GROUP, pgrp->pg_id);
uma_zfree(pgrp_zone, pgrp);
struct pgrp *pgrp;
pgrp = p->p_pgrp;
PGRP_LOCK_ASSERT(pgrp, MA_NOTOWNED);
SESS_LOCK_ASSERT(pgrp->pg_session, MA_NOTOWNED);
pgrp = p->p_pgrp;
if (isjobproc(jobc_parent(p, NULL), pgrp)) {
PGRP_LOCK(pgrp);
if (pgrp_calc_jobc(pgrp) == 0)
orphanpg(pgrp);
PGRP_UNLOCK(pgrp);
pgrp = q->p_pgrp;
PGRP_LOCK(pgrp);
if (pgrp_calc_jobc(pgrp) == 0) {
if (jobc_parent(q, p) == p && isjobproc(p, pgrp))
orphanpg(pgrp);
pgrp->pg_flags &= ~PGRP_ORPHANED;
PGRP_UNLOCK(pgrp);
pgrp = q->p_pgrp;
PGRP_LOCK(pgrp);
if (pgrp_calc_jobc(pgrp) == 0) {
if (isjobproc(p, pgrp))
orphanpg(pgrp);
pgrp->pg_flags &= ~PGRP_ORPHANED;
PGRP_UNLOCK(pgrp);
orphanpg(struct pgrp *pg)
struct pgrp *pg;
struct pgrp *pgrp;
pgrp = w->target->p_pgrp;
if (pgrp == NULL || sx_try_xlock(&pgrp->pg_killsx))
sx_xlock(&pgrp->pg_killsx);
sx_xunlock(&pgrp->pg_killsx);
if (pgrp != NULL)
sx_xunlock(&pgrp->pg_killsx);
struct pgrp *pgrp;
struct pgrp *newpgrp;
pgrp = NULL;
if (p->p_pgid == p->p_pid || (pgrp = pgfind(p->p_pid)) != NULL) {
if (pgrp != NULL)
PGRP_UNLOCK(pgrp);
struct pgrp *pgrp; /* target pgrp */
struct pgrp *newpgrp;
if ((pgrp = pgfind(uap->pgid)) == NULL) {
if (pgrp == targp->p_pgrp) {
PGRP_UNLOCK(pgrp);
if (pgrp->pg_id != targp->p_pid &&
pgrp->pg_session != curp->p_session) {
PGRP_UNLOCK(pgrp);
PGRP_UNLOCK(pgrp);
error = enterthispgrp(targp, pgrp);
struct pgrp *pg;
struct pgrp *pg;
struct pgrp *pgrp;
pgrp = td->td_proc->p_pgrp;
PGRP_LOCK(pgrp);
pgrp = pgfind(pgid);
if (pgrp == NULL) {
if (!sx_try_xlock(&pgrp->pg_killsx)) {
PGRP_UNLOCK(pgrp);
sx_xlock(&pgrp->pg_killsx);
sx_xunlock(&pgrp->pg_killsx);
LIST_FOREACH(p, &pgrp->pg_members, p_pglist) {
PGRP_UNLOCK(pgrp);
sx_xunlock(&pgrp->pg_killsx);
pgsignal(struct pgrp *pgrp, int sig, int checkctty, ksiginfo_t *ksi)
if (pgrp) {
PGRP_LOCK_ASSERT(pgrp, MA_OWNED);
LIST_FOREACH(p, &pgrp->pg_members, p_pglist) {
tty_rel_pgrp(struct tty *tp, struct pgrp *pg)
struct pgrp *pg;
struct pgrp *pg;
LIST_ENTRY(pgrp) pg_hash; /* (e) Hash chain. */
extern LIST_HEAD(pgrphashhead, pgrp) *pgrphashtbl;
struct pgrp *pgfind(pid_t); /* Find process group by id. */
int enterpgrp(struct proc *p, pid_t pgid, struct pgrp *pgrp,
int enterthispgrp(struct proc *p, struct pgrp *pgrp);
int pgrp_calc_jobc(struct pgrp *pgrp);
struct pgrp *p_pgrp; /* (c + e) Pointer to process group. */
struct pgrp *siu_pgrp; /* (c) process group to receive ... */
struct pgrp;
void pgsignal(struct pgrp *pgrp, int sig, int checkctty, ksiginfo_t *ksi);
struct pgrp *t_pgrp; /* (t) Foreground process group. */
void tty_rel_pgrp(struct tty *tp, struct pgrp *pgrp);
struct pgrp;
pgrp = getpgrp();
(pid_t)ctty_pgrp != pgrp)
static pid_t pgrp; /* our process group */
pid_t pgrp;
pgrp = tcgetpgrp(fd);
if (pgrp == -1)
else if (pgrp != getpgrp())