文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>signal + alarm 注意事项

signal + alarm 注意事项

时间:2010-12-10  来源:LaoLiulaoliu

signal + alarm 是很早就看到过的一个定时器模型,和ACE的定时器还是有很大差别的。   首先,signal + alarm 只有一个进程,一个线程。   其次,产生alarm信号时,进程的其他部分暂时停止,执行signal指定的函数。   那么产生的问题是:如果进程其他部分停止,而开始执行signal函数,是否就会形成天然的“锁”,对一个全局变量在signal函数的内外分别调用不会产生问题?   我建立一个全局的文件指针变量,在signal函数内部关闭指针,开新文件,写一句话;外部往文件指针所指的文件写一句话。测试的结果是,他们没有形成天然的“锁”,需要对两部分分别加锁。可以用文件锁。   当然我最后选择了线程+睡眠的方式,用线程的互斥锁。

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


相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载