以下のコードの実行に問題があります。このコードは、getutent()を呼び出して、現在システムにログインしているユーザーの総数をカウントします。タイマーは1秒ごとに呼び出され、「isSigAlrmOccured」という名前のブール値をtrueに設定して終了します。メイン関数は、このブール値をチェックしてタイマー信号が配信されているかどうかをチェックし、ログインしているユーザーの数を監視します。残念ながら、タイマー信号はメインプログラムに正しく2回しか配信されず、それ以降はそれ以上信号を受信できません。一時停止関数の呼び出しは、最初の2つのシグナルの後で中断されることはありません。
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <utmp.h>
#include <errno.h>
static int isSigAlrmOccured;
void alarm_handler (int signo)
{
static int i=1;
printf("\n Signal Occurred %d times\n",i++);
isSigAlrmOccured = 1;
}
int main (int argc, char *argv[]) {
struct itimerval delay;
struct utmp *utmpstruct;
int numuser;
int ret;
signal (SIGALRM, alarm_handler);
delay.it_value.tv_sec = 1;
delay.it_value.tv_usec = 0;
delay.it_interval.tv_sec = 1;
delay.it_interval.tv_usec = 0;
ret = setitimer (ITIMER_REAL, &delay, NULL);
if (ret) {
perror ("setitimer");
return 0;
}
for (;;) {
pause ( );
/* count the number of users */
if ( (errno == EINTR) && (isSigAlrmOccured) ) {
isSigAlrmOccured = 0;
setutent();
while ((utmpstruct = getutent())) {
if ((utmpstruct->ut_type == USER_PROCESS) &&
(utmpstruct->ut_name[0] != '\0'))
numuser++;
}
endutent();
}
}
return 0;
}
出力:
信号が1回発生しました
信号が2回発生しました