Chinaunix首页 | 论坛 | 博客
  • 博客访问: 829050
  • 博文数量: 330
  • 博客积分: 9641
  • 博客等级: 中将
  • 技术积分: 3181
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-19 14:41
文章分类

全部博文(330)

文章存档

2012年(17)

2011年(135)

2010年(85)

2009年(57)

2008年(36)

我的朋友

分类: C/C++

2010-12-10 18:27:51

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;
}


阅读(691) | 评论(1) | 转发(0) |
0

上一篇:C API of libconfig

下一篇:C语言面向对象编程

给主人留下些什么吧!~~

chinaunix网友2010-12-13 14:38:07

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com