信号相关的接口

信号相关的接口

例1: 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <signal.h>
int main(int argc, char *argv[])
{
//    argv[1]++;
//    kill(atoi(argv[2]),atoi(argv[1]));

    kill(-1,9);
    //return  0;  //有前面的"kill(-1, 9)", 不会执行到这里来.
  printf("i'm kill myself...\n"); 
  raise(
9);  //自杀. 如果有前面的"kill(-1, 9)", 不会执行到这里来.
  printf("Can`t goto here !!!\n");
  return 0; 
}

编译运行后, 桌面瞬间没有了. 立即进入登录界面.

 

例2: alarm(x)函数在指定x秒的时间后, 发SIGALRM信号

myalarm.c

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <signal.h>

void handler(int signum)
{
#if 1
    time_t now;
    time(&now);
    puts(ctime(&now));
    alarm(1);
#endif
}

int main(int argc, char *argv[])
{

    signal(SIGALRM,handler);
    
//    alarm(atoi(argv[1]));
//    pause();
    
    alarm(1);

    getchar();

    return 0;
}

编译链接执行. 输出如下:

每秒打印一次当前时间. 当注释掉handle()函数中的alarm(1)后, 只会打印一次. 即alarm()只会产生一次SIGALRM信号

例3: setitimer() 定时

mysetitimer.c

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <signal.h>
#include <sys/time.h>

void handler(int signum)
{
    time_t now;
    time(&now);
    puts(ctime(&now));
}

int main(int argc, char *argv[])
{

    struct itimerval val;
    
    signal(SIGALRM,handler);

    val.it_value.tv_sec = 5;
    val.it_value.tv_usec = 0;

    val.it_interval.tv_sec = 1;
    val.it_interval.tv_usec = 0;

    time_t now;
    time(&now);
    puts(ctime(&now));

    setitimer(ITIMER_REAL,&val,NULL);
    getchar();

    return 0;
}

编译链接运行, 结果输出如下:

第一次打印后, 再过5秒才有第二次打印. 后续的都是每秒打印一次. 也即setitimer()可设定产生SIGALRM信号的时间间隔, 以及第二次与第一次产生SIGALRM信号的间隔

posted @ 2016-01-04 20:10  zhanglong71  阅读(142)  评论(0编辑  收藏  举报