ape: an implemenation of getitimer setitimer

This commit is contained in:
spew 2018-07-01 18:48:12 -04:00
parent 9dc907361c
commit 91d0343627
5 changed files with 103 additions and 2 deletions

View file

@ -37,9 +37,11 @@ typedef int sig_atomic_t;
#define SIGTSTP 18 /* interactive stop */
#define SIGTTIN 19 /* read from ctl tty by member of background */
#define SIGTTOU 20 /* write to ctl tty by member of background */
#define SIGVTALRM 21 /* virtual alarm clock */
#define SIGPROF 22 /* profiling alarm clock */
#ifdef _BSD_EXTENSION
#define NSIG 21
#define NSIG 23
#endif
#ifdef __cplusplus

View file

@ -9,6 +9,11 @@ struct timeval {
long tv_usec;
};
struct itimerval {
struct timeval it_interval;
struct timeval it_value;
};
#ifdef _BSD_EXTENSION
struct timezone {
int tz_minuteswest;
@ -17,6 +22,12 @@ struct timezone {
#endif
#endif /* __TIMEVAL__ */
#define ITIMER_REAL 0
#define ITIMER_VIRTUAL 1
#define ITIMER_PROF 3
extern int gettimeofday(struct timeval *, struct timezone *);
int getitimer(int, struct itimerval *);
int setitimer(int, const struct itimerval *, struct itimerval *);
#endif /* __SYSTIME_H */

View file

@ -28,10 +28,11 @@ static struct {
{"sys: trap: address error", SIGSEGV},
{"sys: trap: TLB", SIGSEGV},
{"sys: write on closed pipe", SIGPIPE},
{"alarm", SIGALRM},
{"term", SIGTERM},
{"usr1", SIGUSR1},
{"usr2", SIGUSR2},
{"virtual alarm", SIGVTALRM},
{"profiling alarm", SIGPROF},
};
#define NSIGTAB ((sizeof sigtab)/(sizeof (sigtab[0])))

View file

@ -0,0 +1,86 @@
#include <sys/types.h>
#include <sys/time.h>
#include <sys/wait.h>
#include <signal.h>
#include <errno.h>
#include <time.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
typedef struct Timer Timer;
struct Timer {
int pid, signal;
struct itimerval itimer;
};
Timer timers[3] = {
{0, SIGALRM},
{0, SIGVTALRM},
{0, SIGPROF},
};
void
timerloop(Timer *timer, const struct timeval tval)
{
pid_t ppid;
struct timespec t, s;
ppid = getppid();
t.tv_sec = tval.tv_sec;
t.tv_nsec = tval.tv_usec*1000;
for(;;){
nanosleep(&t, &s);
kill(ppid, timer->signal);
}
}
int
setitimer(int which, const struct itimerval *new, struct itimerval *curr)
{
pid_t pid;
int status;
Timer *timer;
if(which < 0 || which >= 3){
errno = EINVAL;
return -1;
}
timer = timers+which;
if(timer->pid != 0){
kill(timer->pid, SIGKILL);
waitpid(timer->pid, &status, 0);
}
switch(pid = fork()){
default:
timer->pid = pid;
if(curr != NULL)
*curr = timer->itimer;
timer->itimer = *new;
break;
case -1:
errno = EFAULT;
return -1;
case 0:
timerloop(timer, new->it_interval);
exit(0);
}
return 0;
}
int
getitimer(int which, struct itimerval *curr)
{
Timer *timer;
if(which < 0 || which >= 3){
errno = EINVAL;
return -1;
}
timer = timers+which;
*curr = timer->itimer;
return 0;
}

View file

@ -15,6 +15,7 @@ OFILES=\
gethostbyaddr.$O\
gethostbyname.$O\
gethostname.$O\
getitimer.$O\
getnameinfo.$O\
getopt.$O\
getpeername.$O\