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

📄 alarm.c

📁 早期freebsd实现
💻 C
字号:
/* * This software is Copyright 1989 by Jack Hudler. * * Permission is hereby granted to copy, reproduce, redistribute or otherwise * use this software as long as: there is no monetary profit gained * specifically from the use or reproduction or this software, it is not * sold, rented, traded or otherwise marketed, and this copyright notice is * included prominently in any copy made. * * The author make no claims as to the fitness or correctness of this software * for any use whatsoever, and it is provided as is. Any use of this software * is at the user's own risk. * *//****************************** Module Header ******************************\* Module Name: alarm.c* Created    : 11-08-89* Author     : Jack Hudler  [jack@csccat.lonestar.org]* Copyright  : 1988 Jack Hudler.* Function   : Unix like alarm signal simulator.\***************************************************************************//* Tested using OS2 1.2 with Microsoft C 5.1 and 6.0. */#define INCL_DOSPROCESS#define INCL_DOSSIGNALS#define INCL_DOS#include <os2.h>#include <stdlib.h>#include <stdio.h>#include <signal.h>#include "alarm.h"#define ALARM_STACK 4096    /* This maybe over kill, but the page size is 4K */static  PBYTE     pbAlarmStack;static  SEL       selAlarmStack;static  TID       tidAlarm;static  PID       pidMain;static  BOOL      bAlarmInit=FALSE;static  BOOL      bAlarmRunning=FALSE;static  USHORT    uTime;static VOID FAR alarm_thread ( VOID ){    while(1)    {      if (bAlarmRunning)      {        DosSleep(1000L);        uTime--;        if (uTime==0L)        {          // send signal to the main process.. I could have put raise() here          // however that would require the use of the multithreaded library,          // and it does not contain raise()!          // I tried it with the standard library, this signaled ok, but a          // test printf in the signal would not work and even caused SEGV.          // So I signal the process through OS/2 and then the process          // signals itself.          if (bAlarmRunning)            DosFlagProcess(pidMain,FLGP_PID, PFLG_A,1);          bAlarmRunning=FALSE;        }      }      else        DosSleep(500L);    }}static VOID PASCAL FAR AlarmSignal(USHORT usSigArg,USHORT usSigNum){    /*     * this is not executed from the thread. The thread triggers Process     * flag A which is in the main processes scope, this inturn triggers     * (via the raise) SIGUSR1 which is defined to SIGALRM.     */    raise(SIGUSR1);}static void alarm_init(void){    PFNSIGHANDLER pfnPrev;    USHORT       pfAction;    PIDINFO      pid;    bAlarmInit = TRUE;    if (!DosAllocSeg( ALARM_STACK, (PSEL) &selAlarmStack, SEG_NONSHARED ))    {      OFFSETOF(pbAlarmStack) = ALARM_STACK - 2;      SELECTOROF(pbAlarmStack) = selAlarmStack;      /* Create the thread */      if (DosCreateThread( alarm_thread, &tidAlarm, pbAlarmStack ))      {        fprintf(stderr,"Alarm thread failed to start.\n");        exit(1);      }      /* Setup the signal handler for Process Flag A */      if (DosSetSigHandler(AlarmSignal,&pfnPrev,&pfAction,SIGA_ACCEPT,SIG_PFLG_A))      {        fprintf(stderr,"SigHandler Failed to install.\n");        exit(1);      }      /* Save main process ID, we'll need it for triggering the signal */      DosGetPID(&pid);      pidMain = pid.pid;    }    else      exit(1);}unsigned alarm(unsigned sec){    if (!bAlarmInit) alarm_init();    if (sec)    {      uTime = sec;      bAlarmRunning = TRUE;    }    else      bAlarmRunning = FALSE;    return 0;}#ifdef TESTING/* A simple test to see if it works */BOOL  x;void timeout(void){    fprintf(stderr,"ALARM TRIGGERED!!\n");    DosBeep(1000,500);    x++;}void main(void){    (void) signal(SIGALRM, timeout);    (void) alarm(1L);    printf("ALARM RUNNING!!\n");    while(!x);}#endif

⌨️ 快捷键说明

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