pgrp
int pgrp;
pgrp = pcurrjob ? pcurrjob->p_jobid : getpid();
pgetty(wanttty, pgrp);
pgetty(int wanttty, int pgrp)
if (setpgid(0, pgrp) == -1) {
(void) tcsetpgrp(FSHTTY, pgrp);
int pgrp;
pgrp = pcurrjob ? pcurrjob->p_jobid : getpid();
pgetty(wanttty, pgrp);
if (Flag(FMONITOR) && ttypgrp_ok && j->pgrp) {
shf_fprintf(shf, "%d\n", j->pgrp ? j->pgrp :
if (j->pgrp && j->pgrp == job)
if (j->pgrp == 0)
killpg(j->pgrp, SIGHUP);
if (j->pgrp == 0)
killpg(j->pgrp, SIGCONT);
j->pgrp = 0;
if (j->pgrp == 0) { /* First process */
j->pgrp = p->pid;
setpgid(p->pid, j->pgrp);
tcsetpgrp(tty_fd, j->pgrp);
if (j->pgrp == 0) { /* started when !Flag(FMONITOR) */
(void) killpg(j->pgrp, SIGCONT);
if (killpg(j->pgrp, sig) == -1) {
if (j->pgrp == 0) {
j->saved_ttypgrp : j->pgrp) == -1) {
j->saved_ttypgrp : j->pgrp),
if (j->state == PRUNNING && killpg(j->pgrp, SIGCONT) == -1) {
pid_t pgrp; /* process group of job */
tcsetpgrp(int fd, pid_t pgrp)
s = pgrp;
struct pgrp pgrp;
if (KREAD(kd, (u_long)process.ps_pgrp, &pgrp)) {
if (KREAD(kd, (u_long)pgrp.pg_session, &sess)) {
(u_long)pgrp.pg_session);
if (pgrp.pg_id != (pid_t)arg)
&ucred, &pgrp, process.ps_mainproc, pr, &sess,
KREAD(kd, (u_long)tty.t_pgrp, &pgrp)) {
kp.p_tpgid = tty.t_pgrp ? pgrp.pg_id : -1;
&ucred, &pgrp, p, pr, &sess, vmp, limp, sap,
KREAD(kd, (u_long)tty.t_pgrp, &pgrp)) {
kp.p_tpgid = tty.t_pgrp ? pgrp.pg_id : -1;
int arg, pgrp;
pgrp = fcntl(fd, F_GETOWN);
if (pgrp == -1)
if (pgrp != 0)
errx(1, "fcntl: F_GETOWN: expected 0, got %d", pgrp);
if (ioctl(fd, FIOGETOWN, &pgrp) == -1)
if (pgrp != 0)
errx(1, "ioctl: FIOGETOWN: expected 0, got %d", pgrp);
pgrp = fcntl(fd, F_GETOWN);
if (pgrp == -1)
if (pgrp != -getpgrp())
-getpgrp(), pgrp);
if (ioctl(fd, FIOGETOWN, &pgrp) == -1)
if (pgrp != -getpgrp())
-getpgrp(), pgrp);
int arg, pgrp;
if (ioctl(fd, TIOCGPGRP, &pgrp) == -1)
if (pgrp != 0)
errx(1, "ioctl: TIOCGPGRP: expected 0, got %d", pgrp);
if (ioctl(fd, TIOCGPGRP, &pgrp) == -1)
if (pgrp != getpgrp())
errx(1, "ioctl: TIOCGPGRP: expected %d, got %d", getpgrp(), pgrp);
pid_t pgrp;
pgrp = setsid();
if (pgrp == -1) {
kill(-pgrp, SIGTERM);
if (kill(-pgrp, SIGTERM) == -1)
err(1, "kill %d", -pgrp);
struct pgrp pgrp0;
struct pgrp *pg;
pool_init(&pgrp_pool, sizeof(struct pgrp), 0, IPL_NONE,
struct pgrp *
struct pgrp *pgrp;
LIST_FOREACH(pgrp, PGRPHASH(pgid), pg_hash)
if (pgrp->pg_id == pgid)
return (pgrp);
enternewpgrp(struct process *pr, struct pgrp *pgrp, struct session *newsess)
pgrp->pg_session = newsess;
pgrp->pg_session = pr->ps_session;
pgrp->pg_session->s_count++;
pgrp->pg_id = pr->ps_pid;
LIST_INIT(&pgrp->pg_members);
LIST_INIT(&pgrp->pg_sigiolst);
LIST_INSERT_HEAD(PGRPHASH(pr->ps_pid), pgrp, pg_hash);
pgrp->pg_jobc = 0;
enterthispgrp(pr, pgrp);
enterthispgrp(struct process *pr, struct pgrp *pgrp)
struct pgrp *savepgrp = pr->ps_pgrp;
fixjobc(pr, pgrp, 1);
pr->ps_pgrp = pgrp;
LIST_INSERT_HEAD(&pgrp->pg_members, pr, ps_pglist);
struct pgrp *savepgrp = pr->ps_pgrp;
pgdelete(struct pgrp *pgrp)
sigio_freelist(&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;
LIST_REMOVE(pgrp, pg_hash);
SESSRELE(pgrp->pg_session);
pool_put(&pgrp_pool, pgrp);
fixjobc(struct process *pr, struct pgrp *pgrp, int entering)
struct pgrp *hispgrp;
struct session *mysession = pgrp->pg_session;
if ((hispgrp = pr->ps_pptr->ps_pgrp) != pgrp &&
pgrp->pg_jobc++;
else if (--pgrp->pg_jobc == 0)
orphanpg(pgrp);
if ((hispgrp = pr->ps_pgrp) != pgrp &&
orphanpg(struct pgrp *pg)
struct pgrp *pgrp;
LIST_FOREACH(pgrp, &pgrphashtbl[i], pg_hash) {
pgrp, pgrp->pg_id, pgrp->pg_session,
pgrp->pg_session->s_count,
LIST_FIRST(&pgrp->pg_members));
LIST_FOREACH(pr, &pgrp->pg_members, ps_pglist) {
void pgdelete(struct pgrp *);
void fixjobc(struct process *, struct pgrp *, int);
static void orphanpg(struct pgrp *);
struct pgrp *newpgrp;
struct pgrp *pgrp, *newpgrp; /* target pgrp */
if ((pgrp = pgfind(pgid)) == NULL) {
} else if (pgrp != targpr->ps_pgrp) { /* anything to do? */
pgrp->pg_session != curpr->ps_session)
enterthispgrp(targpr, pgrp);
struct pgrp *pg;
struct pgrp *pg;
struct pgrp *pgrp = NULL;
pgrp = pgfind(-pgid);
if (pgrp == NULL) {
if (pgrp->pg_session != p->p_p->ps_session) {
sigio->sio_pgrp = pgrp;
LIST_INSERT_HEAD(&pgrp->pg_sigiolst, sigio, sio_pgsigio);
struct pgrp *pgrp;
pgrp = cp->p_p->ps_pgrp;
pgrp = pgfind(pgid);
if (pgrp == NULL)
LIST_FOREACH(pr, &pgrp->pg_members, ps_pglist) {
pgsignal(struct pgrp *pgrp, int signum, int checkctty)
if (pgrp)
LIST_FOREACH(pr, &pgrp->pg_members, ps_pglist)
pgrp = pr1->ps_pgrp;
if (pgrp == NULL)
else if (pgrp->pg_session != pr->ps_session)
tp->t_pgrp = pgrp;
struct pgrp *pgrp = pgfind(*(int *)data);
else if (pgrp == NULL)
else if (pgrp->pg_session != pr->ps_session)
tp->t_pgrp = pgrp;
struct pgrp *pgrp;
pgrp = pgfind(-pgid);
struct pgrp *ps_pgrp; /* [K|m] Pointer to process group. */
extern LIST_HEAD(pgrphashhead, pgrp) *pgrphashtbl;
struct pgrp *pgfind(pid_t); /* Find process group by id. */
void enternewpgrp(struct process *, struct pgrp *, struct session *);
void enterthispgrp(struct process *, struct pgrp *);
LIST_ENTRY(pgrp) pg_hash; /* Hash chain. */
struct pgrp *siu_pgrp; /* [I] process group to receive ... */
void pgsignal(struct pgrp *pgrp, int sig, int checkctty);
struct pgrp *t_pgrp; /* Foreground process group. */
struct pgrp;
static pid_t pgrp = -1;
if (pgrp == -1)
pgrp = getpgrp();
ctty_pgrp == pgrp));
pid_t pgrp;
if (ioctl(slave, TIOCGPGRP, &pgrp) != -1)
killpg(pgrp, SIGWINCH);