⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 posix_sig.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#if !defined(lint) && defined(SCCSIDS)static  char sccsid[] = "@(#)posix_sig.c 1.1 92/07/30 Copyr 1989 Sun Micro";#endif/* * posix signal package */#include <stdio.h>#include <signal.h>#include <errno.h>#define cantmask        (sigmask(SIGKILL)|sigmask(SIGSTOP))extern errno;/* * sigemptyset - all known signals */sigemptyset(sigp)    sigset_t *sigp;{    if (!sigp)	return errno = EINVAL, -1;    *sigp = 0;    return 0;}    /* * sigfillset - all known signals */sigfillset(sigp)    sigset_t *sigp;{    if (!sigp)	return errno = EINVAL, -1;    *sigp = sigmask(NSIG) - 1;    return 0;}    /* * add the signal to the set */sigaddset(sigp,signo)	    sigset_t* sigp;{    if (!sigp  ||  signo <= 0  ||  signo >= NSIG)	return errno = EINVAL, -1;    *sigp |= sigmask(signo);    return 0;}/* * remove the signal from the set */sigdelset(sigp,signo)    sigset_t* sigp;{    if (!sigp  ||  signo <= 0  ||  signo >= NSIG)	return errno = EINVAL, -1;    *sigp &= ~sigmask(signo);    return 0;}/* * return true if the signal is in the set (return is 0 or 1) */sigismember(sigp,signo)    sigset_t* sigp;{    if (!sigp  ||  signo <= 0  ||  signo >= NSIG)	return errno = EINVAL, -1;    return (*sigp & sigmask(signo)) != 0;}/* * sigsuspend - wait for sig */sigsuspend(sigp)    sigset_t* sigp;{    if (!sigp)	return errno = EINVAL, -1;    return sigpause(*sigp);}/* * sigaction - install a handler */sigaction(signo, act, oact)    struct sigaction* act;    struct sigaction* oact;{    struct sigvec sv;    struct sigvec nsv;    int ret;#ifdef POSIX    if (signo <= 0 || signo >= NSIG || ((cantmask & sigmask(signo)) && act))#else    if (signo <= 0 || signo >= NSIG || (cantmask & sigmask(signo)))#endif POSIX	return errno = EINVAL, -1;    if (act) {	sv.sv_mask = act->sa_mask;	sv.sv_handler = act->sa_handler;#ifdef S5EMUL	sv.sv_flags = act->sa_flags | SA_INTERRUPT;#else	sv.sv_flags = act->sa_flags;#endif	if (signo != SIGCHLD)	    sv.sv_flags &= ~SV_NOCLDSTOP;    }    if (act  &&  oact)	ret = sigvec(signo, &sv, &nsv);    else if (act)	ret = sigvec(signo, &sv, (struct sigvec*)0);    else	ret = sigvec(signo, (struct sigvec*)0, &nsv);    if (oact) {	oact->sa_flags = nsv.sv_flags;	oact->sa_mask = nsv.sv_mask;	oact->sa_handler = nsv.sv_handler;    }    return ret;}/* * setprocmask - set the signal mask */sigprocmask(how, set, oset)    sigset_t* set;    sigset_t* oset;{    sigset_t retmask, Set;    if (!set) {	retmask = sigblock(0);	if (oset)	    *oset = retmask;	return 0;    }    Set = *set;    switch (how) {    default:	errno = EINVAL;	return -1;    case SIG_BLOCK:	retmask = sigblock(Set);	break;    case SIG_UNBLOCK:	sigfillset(&retmask);	retmask = sigblock(retmask) & ~Set;	retmask = sigsetmask(retmask);	break;    case SIG_SETMASK:	retmask = sigsetmask(Set);	break;    }    if (oset)	*oset = retmask;    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -