[学习笔记]信号发送
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; }