_sleep.c

来自「minix操作系统最新版本(3.1.1)的源代码」· C语言 代码 · 共 70 行

C
70
字号
/*	sleep() - Sleep for a number of seconds.	Author: Kees J. Bot *								24 Apr 2000 * (Inspired by the Minix-vmd version of same, except that * this implementation doesn't bother to check if all the signal * functions succeed.  Under Minix that is no problem.) */#include <lib.h>#define sleep _sleep#include <signal.h>#include <unistd.h>#include <time.h>static void handler(int sig){	/* Dummy signal handler. */}unsigned sleep(unsigned sleep_seconds){	sigset_t ss_full, ss_orig, ss_alarm;	struct sigaction action_alarm, action_orig;	unsigned alarm_seconds, nap_seconds;	if (sleep_seconds == 0) return 0;	/* No rest for the wicked */	/* Mask all signals. */	sigfillset(&ss_full);	sigprocmask(SIG_BLOCK, &ss_full, &ss_orig);	/* Cancel currently running alarm. */	alarm_seconds= alarm(0);	/* How long can we nap without interruptions? */	nap_seconds= sleep_seconds;	if (alarm_seconds != 0 && alarm_seconds < sleep_seconds) {		nap_seconds= alarm_seconds;	}	/* Now sleep. */	action_alarm.sa_handler= handler;	sigemptyset(&action_alarm.sa_mask);	action_alarm.sa_flags= 0;	sigaction(SIGALRM, &action_alarm, &action_orig);	alarm(nap_seconds);	/* Wait for a wakeup call, either our alarm, or some other signal. */	ss_alarm= ss_orig;	sigdelset(&ss_alarm, SIGALRM);	sigsuspend(&ss_alarm);	/* Cancel alarm, set mask and stuff back to normal. */	nap_seconds -= alarm(0);	sigaction(SIGALRM, &action_orig, NULL);	sigprocmask(SIG_SETMASK, &ss_orig, NULL);	/* Restore alarm counter to the time remaining. */	if (alarm_seconds != 0 && alarm_seconds >= nap_seconds) {		alarm_seconds -= nap_seconds;		if (alarm_seconds == 0) {			raise(SIGALRM);		/* Alarm expires now! */		} else {			alarm(alarm_seconds);	/* Count time remaining. */		}	}	/* Return time not slept. */	return sleep_seconds - nap_seconds;}

⌨️ 快捷键说明

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