test.c
#include <stdio.h>
#include <signal.h>
void int_handler(void);
int main(int argc, char ** argv)
{
sigset( SIGINT, int_handler);
printf( "Process_pid=[%d]\n", getpid() );
while(1);
return 0;
}
void int_handler(void)
{
printf("Get a SIGINT signal!\n");
}
SIGINT: 程序中止信号,在用户键入INTR字符(通常是Ctrl+C)时发出。
gcc test.c -o test
运行程序:
./test
按下Ctrl+C键(or kill -2 1234,kill -SIGINT 1234),程序并不退出,而是打印输出 Get a SIGINT signal!。
可以使用Ctrl+\ 来退出(SIGQUIT)。
//
signal函数
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
第一个参数signum:指明了所要处理的信号类型,它可以取除了SIGKILL和SIGSTOP外的任何一种信号。
第二个参数handler:描述了与信号关联的动作,它可以取以下三种值:
(1)SIG_IGN
这个符号表示忽略该信号。
#include <stdio.h>
#include <signal.h>
int main(int argc, char *argv[])
{
signal(SIGINT, SIG_IGN);
while(1);
return 0;
}
按下Ctrl+C,由于信号忽略了,程序并不退出。
(2)SIG_DFL
这个符号表示恢复对信号的系统默认处理。不写此处理函数默认也是执行系统默认操作。
#include <stdio.h>
#include <signal.h>
int main(int argc, char *argv[])
{
signal(SIGINT, SIG_DFL);
while(1);
return 0;
}
这时就可以按下CTRL +C 来终止该进程了。把signal(SIGINT, SIG_DFL);这句去掉,效果是一样的
(3)sighandler_t类型的函数指针
如上。
//
kill - send a signal to a process
EXAMPLES
kill -9 -1
Kill all processes you can kill.
kill -l 11
Translate number 11 into a signal name.
kill -L //kill -l ???
List the available signal choices in a nice table.
kill 123 543 2341 3453
Send the default signal, SIGTERM, to all those processes.
发送信号SIGTERM给进程 4589,方法:
kill -s TERM 4589
kill -s 15 4589
kill -n TERM 4589
kill -n 15 4589
kill -15 4589 //建议
kill -TERM 4589 //建议
kill -SIGTERM 4589
在进程中,SIGTSTP(信号量20: Ctrl+Z)和SIGKILL(信号量9)信号是不可以被捕获或者忽略的。除此之外,其他的各种信号都可以被进程捕获和处理。
ps -aux
ps -ef
ps -ef | grep test
通过名字杀死进程:
killall test
pkill test
killall和pkill是相似的,不过如果给出的进程名不完整,killall会报错。pkill只要给出进程名的一部分就可以终止进程。
pkill tes :ok
killall tes :error