在内核中有一个对象叫信号,进程A与进程B通信在用户空间发送信号是不可能的。只能通过内核发送信号。
信号对象在内核中已经存在了。
内核空间有多少种信号?
通过Linux命令Kill -l 便可以查看有多少种信号。
前面数字代表信号ID,后面字符串为信号的宏,每个宏代表不同的功能。一共有64种信号。
信号的发送:
kill()----发送信号
#include <signal.h>
#include <sys/types.h>
参数:
pid:
正数:要接收信号的进程的进程号
0:信号被发送到所有和pid进程在同一个进程组的进程
-1:信号发送给所有的进程表中的进程(除了进程号最大的以外)
sig:信号
返回值:
成功:0
失败:-1
int kill(pid_t,int sig)
案例——kill命令实现
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
#include <stdlib.h>
int main(int args,char *argv[]){
int sig;
int pid;
if(args < 3){
printf("please input parsm\n");
return -1;
}
sig = atoi(argv[1]);
pid = atoi(argv[2]);
printf("sig = %d, pid = %d\n",sig,pid);
kill(pid,sig);
return 0;
}
在运行一个死循环进程
#include <stdio.h>
int main(){
while(1);
}
使用ps -axj命令查看死循环进程的Id号为4416
运行mykill
没有报错。再次回到运行死循环程序的终端里。
提示已经杀死进程。
raise() – 发送信号
raise函数和kill函数一样可以发送信号,但是raise函数可以发信号给自己
raise(getpid(),sig)
#include <signal.h>
#include <sys/types.h>
int raise(int sig)
参数:sig信号
返回值:
成功:0 失败 :-1