Linux下面使用C语言捕获Ctrl+C信号

来源:互联网 发布:淘宝卖家怎么参返利 编辑:程序博客网 时间:2024/05/22 05:25

转自:http://blog.csdn.net/nuaa_ybl/article/details/7091745

在Linux下面写一个程序,如果程序中出现死循环的话,我们就应该在键盘上按Ctrl+C来终止我们的程序,那么我们也可以取捕获这个信号,然后执行我们自己的信号处理程序,输出一些有用的信息来帮助我们调试程序,这也算是一中技巧吧,虽然我觉得技巧不是很重要。如果我们不去捕获这个信号的话,那么信号产生后就去执行OS的信号处理程序。信号和中断很像,我们既可以使用OS的中断处理程序,也可以截获中断执行自己的中断处理程序。下面是一个多线程的例子:

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>

#define true 1

void * One(void * no) 
{
    while (true)
    {
    printf("NUAACS1\n");
    sleep(1);
    }
}

void * Two(void * no) 
{
    while (true)
    {
    printf("NUAACS2\n");
    sleep(1);
    }
}

void Stop(int signo) 
{
    printf("oops! stop!!!\n");
    _exit(0);
}

int main()
{
    int res;
    pthread_t A, B;

    signal(SIGINT, Stop); 
    res = pthread_create(&A, NULL, One, NULL);
    res = pthread_create(&B, NULL, Two, NULL);
    res = pthread_join(A, NULL);
    res = pthread_join(B, NULL);

    return 0;
}

编译上述程序的命令:gcc nuaa.c -o nuaa -l pthread(假设程序所在文件名位nuaa.c)

注:

1.上述程序中创建了两个线程,线程执行函数的名字随便写,但是线程执行函数的格式必须这么写。

2.在上述程序中我故意使用了_exit(0);目的是说明一个问题,曾经有位interviewer(也就是我现在的导师)问我_exit(0)和exit(0)的区别是什么?我当时说_exit(0)我见过但是没有使用过,但是我在使用exit(0)是发现在main()函数中使用exit(0)和使用return 0的返回值是一样的(如何查看main函数返回值:Linux下面可以在shell中查看, ?表示上一个进程退出时的状态数值,用 echo $? 查看windows下用 echo %errorlevel%,debug的时候,也可以直接查看返回值),其他我就不知道了。The interviewer看上去不有些不太满意,直到后来见面的时候(他貌似对我印象很深,见面时我还没有认出他,他就认出了我,感觉很亲切)我第一个问题就是_exit(0)和exit(0)有何区别?他很和蔼地给我解释了一下:首先exit(0)是通过_exit(0)来实现的,其次,exit(0)回执行一些后续的处理,比如把缓冲区中的内容写到磁盘的相应位置上,关闭没有关闭的文件......而_exit(0)不会做这些事情。

原创粉丝点击