(一)信号
操作系统预先定义好的某些特定的事件,信号可以被产生,也可以被接受。产生和接收的主体都是进程。
进程接受到信号后,怎么处理——信号的响应方式:默认SIG_DFL, 忽略IG_IGN,自定义
如何修改信号的响应方式:typedef void(*Fun) (int);
Fun signal (int signum,Fun fun);//修改信号响应方式的函数signal,信号值,信号类型,修改的是哪一个信号的响应方式。在/usr/include/bits/signum.h里面定义的都是信号,都是宏。
SIGINT Ctrl+z
SIGCHLD 子进程状态被改变是触发的信号。
(二)信号的发送
int kill(int pid,int sigtype);
pid:将信号发送的进程,pid>0 指定接收信号的pid,pid==0 将信号发送给当前进程组中的所有进程,pid==-1,将信号发送给系统上所有的进程,p<-1,将信号发送给进程组id为-pid组内所有进程。
(作业:用kill函数实现kill命令,kill pid默认发送的是15号信号,命令结束的进程是通过信号机制实现的)
(三)信号的底层实现机制

都调用了send_sig(SIGINT,PCB,flag);


连续接收到n次信号,如果第一个信号正在处理则第二个信号会等待第一个处理完成,接收信号的进程会将生育所有的信号都合并成一个信号。信号响应方式一旦修改,后续接收信号一直沿用,直到进程终止或者再次修改。
实现:进程第一次接收打印hello world,第二次接收结束进程。Ctr C=SIGINT
第一次接收到信号和第二次接收到信号之间将响应方式修改。只能在第一次修改处理函数中修改信号的响应方式。
#include<signal.h>
void fun(int sig)
{
printf("sig start = %d\n",sig);
sleep(10);
signal(SIGINT,SIG_DFL);
printf("sig end = %d\n",sig);
signal(SIGINT,SID_DFL);
}
int main(int argc,char*argv[],char*envp[])
{
signal(SIGINT,fun);
while(1)
{
printf("main hello\n");
sleep(1);
} exit(0);
}
2503

被折叠的 条评论
为什么被折叠?



