Linux下C编程:信号处置方法实习运用

时间:2020-11-25 17:24:17 其他 我要投稿

Linux下C编程:信号处置方法实习运用

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是程序打印出的进程号



【Linux下C编程:信号处置方法实习运用】相关文章:

有关Linux下MySQL数据库二进制日志恢复方法10-12

Windows系统和Linux系统下的安装教程11-20

linux中php安装CURL扩展方法示例教程11-18

股票的时间周期实战运用方法09-10

家居空间设计下的健康色彩运用论文01-17

诺基亚c6关机状态下硬格07-25

如何在Linux操作系统下安装迅雷极速版教程12-11

linux服务器如何调整分区大小无损的方法05-20

socket编程的教材12-14

有关Linux下快速安装部署远程连接软件SSH的简明教程介绍12-01