Linux下⾯使⽤C语⾔捕获Ctrl+C信号
在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)
注:linux下的sleep函数
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)不会做这些事情。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论