あれま alarm(3) は obsoleted by setitimer(2) とある。浦島。
setitimer(2)を使うにはsigactionあたりも必要とな。めんどい。
http://www.coins.tsukuba.ac.jp/%7Esyspro/2006/shui/1stHalf.html#sec:signals
いやあ、素晴らしいページだなあ。やっぱstrlcpyだよなー、とか感心して読み
まくり。これだけで本になる。いいなあ、この
くらいのレベルのこと教えたいなあ。ま、このくらいのレベルを受講して
身につけられる学生なら受講せず独学でもマスターできるからな。
自力じゃぎりぎり厳しいくらいの人を独学できる程度に持ち上げることに
意義があるんだなと。
と前置は置いといてあとで忘れたとき用の簡単プログラム。
#include <stdio.h>
#include <sys/time.h>
#include <signal.h>
#include <unistd.h>
int count=29;
int trap()
{
fprintf(stderr, "\e7\r%d\e8", count);
if (count-- <= 0) {
fprintf(stderr, "\nぎゃあ\n");
exit(1);
}
}
int main()
{
struct itimerval x;
struct sigaction sa;
char b[10];
memset(&x, 0, sizeof x);
memset(&sa, 0, sizeof sa);
x.it_interval.tv_sec = 1;
x.it_value.tv_sec = 1;
sa.sa_handler = (void*)trap;
sa.sa_flags = SA_RESTART;
setitimer(ITIMER_REAL, &x, NULL);
sigaction(SIGALRM, &sa, NULL);
fprintf(stderr, "好きな言葉をどうぞ\n%d: ", count+1);
fgets(b, sizeof b, stdin);
printf("読んだのは: [%s]\n", b);
exit(0);
}
関数呼出しより、必要な構造体を初期化する方がたいへん。
SA_RESTARTは、システムコール中にシグナルが発生したときに
デフォルトではそのシステムコール終わっちゃうけど、戻るようにする。
ちなみにハンドラで使っている \e と \e8 というエスケープ
シーケンスはカーソル位置の保存と復帰。
叱咤激励感想ツッコミはゲストブックへ
Generated with mkdiary.rb