日々精進

aikoと旅行とプログラミング

alarm関数とpause関数を利用してsleep関数を実現する。

sleep関数をalarm関数とpause関数を用いて実装する。

書式

alarm関数
#include <unistd.h>

unsigned int alarm(unsigned int seconds);
pause関数
#include <unistd.h>

int pause(void);  

概要

alarm関数

呼び出したプロセスに対して、seconds秒後にSIGALRMを送る関数。

pause関数

呼び出したプロセスが終了したりシグナル捕捉関数が起動するようなシグナルがくるまで待機する関数。

返り値

alarm関数

以前に予定されていたアラームの配送時間が返る。それ以外は0が返る。

pause関数

pause() が返るのは、シグナル捕獲関数から返った場合だけである。その場合 -1 を返し、 errno に EINTR が設定される。

実装例

返り値の実験
#include <stdio.h>
#include <unistd.h>

int main(){
  
  alarm(10);
  printf("%d\n",alarm(10));
  
  return 0;
}

実行結果は以下のとおりになる。

$ a.out
10

1回めのalarmのあとすぐに新しいアラームを設定しているため10が返る。

sleep関数の実現
#include <stdio.h>
#include <unistd.h>
#include <signal.h>

void handler(int sig){
  printf("sleep!\n");
  return;
}
int main(){

  if(signal(SIGALRM, handler) == SIG_ERR){
    fprintf(stderr, "signal Error\n\n");
    return 1;
  }

  while(1){
    alarm(1);
    pause(); 
  }
  return 0;
}