- 相关推荐
Linux下C编程:信号处置方法实习运用
Linux下C编程:信号处置方法实习运用
信号是用于一步作业的。当一个信号发生时,程序会按照现已设定好的程序来实行相应的操作。
进程对信号处置的方法通常有两种:
1、捕捉信号:当一个信号发送个进程时,该进程会调用此信号注册的信号处置函数,来结束相应的操作。对应于每个信号系统通常会有相应的默许处置函数(通常为间断进程)。所以可以设置信号为默许的处置函数。
2、忽略信号。当信号发送时,进程忽略信号。
注:有两个信号是无法捕捉和忽略的SIGKILL和SIGSTOP。它们是提供给管理员,可以在任何时辰间断某个进程而设定的。
对信号处置的需要:在用户编程时有时进程需要对某信号进行当即照应。对有些实时进程来说,当它实行时是不愿意被打断的,这是就需要把接收的信号挂起。
信号的运用:
信号最常见的一个运用便是发生差错时通知进程结束。关于许多差错,如bus差错,浮点差错,调用内存差错等都有相应的信号通知进程。
此外信号还有其他用途。如作业一个大型的科学运算程序,如果在一个无量循环顶用printf来闪现作业情况,必定构成作业功率的下降。所以通过信号,人为的向进程发送消息,来查看作业情况,就大大的提高了作业功率。
Linux下C编程:信号具体含义说明
信号及其简介
信号是一种进程通讯的方法,他运用于异步作业的处置。信号的结束是一种软间断。它被发送为一个正在作业的进程,已奉告进程某个作业发生了。
1) SIGHUP本信号在用户终端联接(正常或非正常)结束时宣告,通常是在终端的控制进程结束时,通知同一session内的各个作业,这时它们与控制终端不再有关.
2) SIGINT程序间断(interrupt)信号,通常是从终端宣告间断指令如ctrl+c或键
3) SIGQUIT和SIGINT类似,但由QUIT字符(通常是Ctrl+\)来控制.进程在因收到SIGQUIT退出时会发生core文件,在这个含义上类似于一个程序差错信号.
4) SIGILL实行了不合法指令.通常是因为可实行文件本身出现差错,或许妄图实行数据段.库房溢出时也有可以发生这个信号.
5) SIGTRAP跟踪骗局信号,由断点指令或其它trap指令发生.由debugger运用.
6) SIGABRT调用abort时发生的信号,将会使进程非正常结束。
6) SIGIOT IO差错信号.
7) SIGBUS系统总线差错时发生的信号,不合法地址,包括内存地址对齐(alignment)犯错.eg:访问一个四个字长的整数,但其地址不是4的倍数.
8) SIGFPE在发生丧身的算术运算差错时宣告.不只包括浮点运算差错,还包括溢出及除数为0等其它一切的算术的差错.
9) SIGKILL可以间断任何进程的信号,只能由管理员宣告,该信号不会被捕捉和忽略。
10) SIGUSR1留给用户运用,用户可在运用程序中自行定义。
11) SIGSEGV妄图访问未分配给自个的内存,或妄图往没有写权限的内存地址写数据,不合法运用内存地址信号。
12) SIGUSR2留给用户运用
13) SIGPIPE当一个进程对管道进行完读后进行写时发生的信号。
14) SIGALRM时钟守时信号,由alarm函数设定的时辰间断时发生的信号。
15) SIGTERM程序结束(terminate)信号,与SIGKILL不一样的是该信号可以被阻塞和处置.通常用来需要程序自个正常退出.shell指令kill缺省发生这个信号.
17) SIGCHLD子进程结束或间断时发生该信号,父进程会收到这个信号.通过该信号父进程可以知道子进程的作业情况。但大多数情况下此信号会被忽略。
18) SIGCONT让一个间断(stopped)的进程继续实行.本信号不能被阻塞.
19) SIGSTOP间断(stopped)进程的实行.注意它和terminate以及interrupt的区别:该进程还未结束,只是暂停实行.本信号不能被阻塞,处置或忽略.
20) SIGTSTP间断进程的作业,但该信号可以被处置和忽略.用户键入SUSP字符时(通常是Ctrl-Z)宣告这个信号
21) SIGTTIN当后台作业要从用户终端读数据时,间断驱动器发生的信号。当读入数据的进程阻塞或忽略这个信号,或读取数据的进程地址进程组是一个孤立进程组时,信号不会发生,而且发生读差错。errno被设为ETO
22) SIGTTOU类似于SIGTTIN,当后台作业要从用户终端读数据时,间断驱动器发生的信号。当读入数据的进程阻塞或忽略这个信号,或读取数据的进程地址进程组是一个孤立进程组时,信号不会发生,而且发生读差错。errno被设为ETO。仅有不一样的是进程可以选择后台写。
23) SIGURG socket上出现紧急情况是宣告的信息。
24) SIGXCPU逾越CPU时辰资源束缚.这个束缚可以由getrlimit/setrlimit来读取/改动
25) SIGXFSZ逾越文件大小资源束缚.
26) SIGVTALRM虚拟时钟信号.类似于SIGALRM,可是核算的是该进程占用的CPU时辰.
27) SIGPROF类似于SIGALRM/SIGVTALRM,但包括该进程用的CPU时辰以及系统调用的时辰.
28) SIGWINCH窗口大小改动时宣告.
29) SIGIO文件描述符准备就绪,可以初步进行输入/输出操作.
30) SIGPWR Power failure电源失效信号。
31)SIGEMT实时硬件发生差错时发生的信号。
有两个信号可以间断进程:SIGTERM和SIGKILL。SIGTERM比照和睦,进程能捕捉这个信号,根据您的需要来关闭程序。在关闭程序之前,您可以结束翻开的记载文件和结束正在做的任务。在某些情况下,假定进程正在进行作业而且不能间断,那么进程可以忽略这个SIGTERM信号。
关于SIGKILL信号,进程是不能忽略的。这是一个“我不管您在做什么,立刻间断”的信号。假定您发送SIGKILL信号给进程,Linux就将进程间断在那里。
注:有六个信号被称为作业信号,SIGCHLD,SIGCONT,SIGSTOP,SIGSTP,SIGTTNI,SIGTTOU.这些信号都是用于协和谐组织各个进程的,也便是结束所谓的作业控制。通常情况下用户不需要对这些信号进行处置,shell会自动结束对这些信号的处置作业。信号之间是相互影响的,当进程接收到SIGCONT信号时,被系统悬挂的SIGSTOP,SIGSTP,SIGTTIN,SIGTTOU将失效。一样进程接收到SIGSTOP,SIGSTP,SIGTTIN,SIGTTOU时,SIGCONT将失效。
Linux下C编程:信号处置
信号处置是linux程序的一个特征。用信号处置来仿照操作系统的间断功用。要想运用信号处置功用,你要做的便是填写一个信号处置函数即可。
#include
#include
#include
#include
int flag = 1;
void func(int sig)
{
printf("I get a signal!\n");
flag = 0;
}
int main()
{
signal(SIGINT, func);
printf("pid:%ld\n",(long)getpid());
while(flag)
pause();
return 0;
}实行,
#gcc sig.c -o sig
#./sig
在另一终端:
#kill -INT 333//333是程序打印出的进程号