signal + alarm 是很早就看到过的一个定时器模型,和ACE的定时器还是有很大差别的。
首先,signal + alarm 只有一个进程,一个线程。
其次,产生alarm信号时,进程的其他部分暂时停止,执行signal指定的函数。
那么产生的问题是:如果进程其他部分停止,而开始执行signal函数,是否就会形成天然的“锁”,对一个全局变量在signal函数的内外分别调用不会产生问题?
我建立一个全局的文件指针变量,在signal函数内部关闭指针,开新文件,写一句话;外部往文件指针所指的文件写一句话。测试的结果是,他们没有形成天然的“锁”,需要对两部分分别加锁。可以用
文件锁。
当然我最后选择了线程+睡眠的方式,用线程的互斥锁。
[2010-02-02]写文件是有缓存的,这里的争议暂时搁置。
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>
FILE *fp;
unsigned seq;
void sigalrm_fn(int sig)
{
time_t tnow;
char fname[256];
tnow = time(NULL);
fclose(fp);
snprintf(fname, sizeof(fname), "%u_%ld.xml", seq++, tnow);
fp = fopen(fname, "w");
fprintf("I am the signal: %dn", sig);
sleep(3);
alarm(1);
}
int init()
{
time_t tnow;
char fname[256];
tnow = time(NULL);
seq = 1;
snprintf(fname, sizeof(fname), "%u_%ld.xml", seq++, tnow);
fp = fopen(fname, "w");
signal(SIGALRM, sigalrm_fn);
alarm(1);
return 0;
}
int main()
{
init();
// getchar();
pause();
while(1)
{
fprintf(fp, "I am the main: %un", seq);
}
return 0;
} |
阅读(1757) | 评论(1) | 转发(0) |