信号:是系统预先定义好的某些特定的事件,信号可以被产生,也可以被接收,产生和接收的实体都是进程。
信号的作用:一个进程向另一个进程通知某一件事情的发生。
信号的定义位置:/usr/include/bits/signum.h(在终端输入命令vim /usr/include/bits/signum.h)
信号处理函数:
SIG_ERR出错 ;SIG_DFL默认处理方式 ;SIG_IGN忽略;eg:signal(SIGINT,SIG_DFL)
1、当进程收到信号时,他所做的处理:默认 忽略 捕获(自定义)
修改信号响应的方式:typedef void(*Fun)(int);
Fun signal(int signum,Fun fun);//signum信号类型,信号值;fun信号响应函数,第一种SIG_DFL默认处理方式,第二种SIG_IGN忽略,第三种自定义一个方法,编写函数。
编写程序实现,当用户在键盘上输入Crtl+c时,当前进程输出一个hello world
此修改方式 直到下一次修改之前,就一直沿用此响应方式
子进程状态改变,会默认向父进程发送SIGCHLD信号。
2、在程序中如何给一个进程发送一个信号:用到kill这个系统调用,kill默认发送15信号
int kill(pid_t pid,int sigtype);//pid指定发送给哪个进程;sigtype指定发送的信号类型
(1)进程给自己发送信号: kill(getpid(),SIGINT);<===>raise(SIGINT);
(2)kill 的pid参数的四种情况:
- pid > 0 将信号发送给pid指定进程。
- pid == 0 将信号发送给同组的所有进程。
- pid < 0 将信号发送给其进程组ID等于pid绝对值的所有进程。
- pid == -1 将信号发送给除了没有权限的所有进程。
(3)通过kill方法实现kill命令
//通过kill方法实现kill命令
int main(int argc,char* argv[])
{
if (argc < 2)
{
printf("please input process's pid.again\n");
exit(0);
}
int sigtype = 15;
int i = 1;
for (; i < argc; ++i)
{
if (i == 1)
{
if (strncmp(argv[1], "-9", 2) == 0)
{
sigtype = 9;//kill -9 pid对应的是9号信号
continue;
}
if (strncmp(argv[1], "-stop", 5) == 0)
{
sigtype = 19;//kill -stop pid对应的是19号信号
continue;
}
}
int pid = 0;
sscanf(argv[i], "%d", &pid);
if (kill(pid, sigtype) == -1)
{
perror("kill error\n");
continue;
}
}
}