zoukankan      html  css  js  c++  java
  • [学习笔记]信号发送

    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;
    }
  • 相关阅读:
    Android Studio NDK编程-环境搭建及Hello!
    Android Studio22-NDK-LLDB调试
    使用Xutils 3 中遇到的一些问题!!!!
    Android 安装时报错INSTALL_FAILED_NO_MATCHING_ABIS 的解决办法
    Android Fragment 剖析
    java 中抽象类和接口的五点区别?
    undefined reference to `__android_log_print'
    android JNI 调用NDK方法
    html如何和CSS联系起来
    Android如何自定义dialog
  • 原文地址:https://www.cnblogs.com/shichuan/p/4448034.html
Copyright © 2011-2022 走看看