sigio
if (signal(SIGIO, sigio) == SIG_ERR)
static void sigio(int);
struct sigio *sigio;
while ((sigio = LIST_FIRST(rmlist)) != NULL) {
LIST_REMOVE(sigio, sio_pgsigio);
crfree(sigio->sio_ucred);
free(sigio, M_SIGIO, sizeof(*sigio));
struct sigio *sigio;
sigio = sir->sir_sigio;
if (sigio != NULL) {
KASSERT(sigio->sio_myref == sir);
if (sigio->sio_pgid > 0)
sigio->sio_proc = NULL;
sigio->sio_pgrp = NULL;
LIST_REMOVE(sigio, sio_pgsigio);
LIST_INSERT_HEAD(rmlist, sigio, sio_pgsigio);
struct sigio *sigio;
while ((sigio = LIST_FIRST(sigiolst)) != NULL)
sigio_unlink(sigio->sio_myref, &rmlist);
struct sigio *sigio;
sigio = malloc(sizeof(*sigio), M_SIGIO, M_WAITOK);
sigio->sio_pgid = pgid;
sigio->sio_ucred = crhold(p->p_ucred);
sigio->sio_myref = sir;
sigio->sio_proc = pr;
LIST_INSERT_HEAD(&pr->ps_sigiolst, sigio, sio_pgsigio);
sigio->sio_pgrp = pgrp;
LIST_INSERT_HEAD(&pgrp->pg_sigiolst, sigio, sio_pgsigio);
sir->sir_sigio = sigio;
crfree(sigio->sio_ucred);
free(sigio, M_SIGIO, sizeof(*sigio));
struct sigio *sigio;
sigio = sir->sir_sigio;
if (sigio != NULL)
pgid = sigio->sio_pgid;
struct sigio *newsigio, *sigio;
sigio = src->sir_sigio;
if (sigio == NULL) {
newsigio->sio_pgid = sigio->sio_pgid;
newsigio->sio_ucred = crhold(sigio->sio_ucred);
newsigio->sio_proc = sigio->sio_proc;
newsigio->sio_pgrp = sigio->sio_pgrp;
struct sigio *sigio;
sigio = sir->sir_sigio;
if (sigio == NULL)
if (sigio->sio_pgid > 0) {
if (CANSIGIO(sigio->sio_ucred, sigio->sio_proc))
prsignal(sigio->sio_proc, sig);
} else if (sigio->sio_pgid < 0) {
LIST_FOREACH(pr, &sigio->sio_pgrp->pg_members, ps_pglist) {
if (CANSIGIO(sigio->sio_ucred, pr) &&
struct sigio;
LIST_HEAD(sigiolst, sigio);
struct sigio *sir_sigio; /* [S] associated sigio struct */
LIST_ENTRY(sigio) sio_pgsigio; /* [S] sigio's for process or group */