[学习笔记]信号发送

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 
", num);
    //kill -alram ` ps -aux | grep 01aram | grep -v vi | awk '{print $2}' ` 
    alarm(1);
}

int main(void)
{
    printf("main ....begin
");
    //注册信号处理函数
    if (signal(SIGALRM, myhandle) == SIG_ERR)
    {
        perror("func signal err
");
        return 0;
    } 
    
    alarm(1);
    while(1) 
    {
        pause();
        printf("pause return
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/shichuan/p/4448034.html