kill函数
Kill基本用法
发送信号的函数有kill和raise
区别:kill既可以向自身发送信号,也可以向其他进程发送信号;
raise函数向进程自身发送信号。
Int kill(pid_t pid, int siq)
int raise(int signo)
Int kill(pid_t pid, int siq)
参数组合情况解释:
kill(pid_t pid, int siq)
pid>0 将信号sig发给pid进程
pid=0 将信号sig发给同组进程
pid=-1 将信号sig发送给所有进程,调用者进程有权限发送的每一个进程(除了1号进程之外,还有它自身)
pid<-1 将信号sig发送给进程组是pid(绝对值)的每一个进程
实验:
//子进程向父进程发送信号
//子进程向同组进程发送信号 (getpgrp()函数获取进程组pid)
结论:注意,如果在fork之前安装信号,则子进程可以继承信号。
kill和sleep在一起
子进程向父进程发送信号
sleep函数几点说明
1)sleep函数作用,让进程睡眠。
2)能被信号打断,然后处理信号函数以后,就不再睡眠了。直接向下执行代码
3)sleep函数的返回值,是剩余的秒数
raise函数
raise
raise
给自己发送信号。raise(sig)等价于kill(getpid(), sig);
killpg
给进程组发送信号。killpg(pgrp, sig)等价于kill(-pgrp, sig);
sigqueue
给进程发送信号,支持排队,可以附带额外数据信息。
pause函数
pause()函数
将进程置为可中断睡眠状态。然后它调用内核函数schedule(),使linux进程调度器找到另一个进程来运行。
pause使调用者进程挂起,直到一个信号被捕获
alarm函数
alarm函数,设置一个闹钟延迟发送信号
告诉linux内核n秒中以后,发送SIGALRM信号;;
手册描述:
NAME
alarm - set an alarm clock for delivery of a signal
SYNOPSIS
#include <unistd.h>
unsigned int alarm(unsigned int seconds);
DESCRIPTION
alarm() arranges for a SIGALRM signal to be delivered to the process in seconds seconds.
If seconds is zero, no new alarm() is scheduled.
In any event any previously set alarm() is cancelled.
实验1:手工发送信号alarm信号实践
kill -ALRM 21333
kill -14 213333
kill -SIGALRM 213333
命令发送信号实践
kill -alram ` ps -aux | grep 01aram | grep -v vi | awk '{print $2}' `
编程实践
void myhandle(int num)
{
printf("recv signal id num : %d \n", num);
//kill -alram ` ps -aux | grep 01aram | grep -v vi | awk '{print $2}' `
alarm(1);
}
int main(void)
{
printf("main ....begin\n");
//注册信号处理函数
if (signal(SIGALRM, myhandle) == SIG_ERR)
{
perror("func signal err\n");
return 0;
}
alarm(1);
while(1)
{
pause();
printf("pause return\n");
}
return 0;
}