zoukankan      html  css  js  c++  java
  • Linux 发送信号

    使用kill命令
    --在命令行执行kill命令。向指定进程发送信号。
    使用kill函数
    int kill(pid_t pid,int sig);
    --参数pid指定一个要杀死的进程,而sig是要发送的信号。
    //kill函数发送信号
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <errno.h>
    
    #include <sys/types.h>
    #include <signal.h>
    
    int main(int arg, char *args[])
    {
        if(arg<2)
        {
            printf("请输入一个参数!
    ");
            return -1;
        }
        pid_t pid=atoi(args[1]);
        int resint=0;
        resint=kill(pid,SIGKILL);
        printf("返回值是%d
    ",resint);//打印0
        return 0;
    }
    使用raise函数
    int raise(int signum);
    kill函数将信号发送给进程,raise函数允许进程向自身发送信号
    raise(signum)相当于kill(getpid(),signum);
    alarm函数设置了一个定时器,当定时器到了给当前进程发送SIGALRM信号。
    unsigned int alarm(unsigned int seconds);
    seconds是计时器时间到后时钟的秒数。
    如果没有设置其他超时,函数返回0,否则返回值为前面安排超时中保留的秒数。
    一个进程只能设置一次超时
    把seconds设置为0可以取消前面的超时设置。
    //捕捉信号
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <errno.h>
    #include <signal.h>
    
    void catch_signal(int sign)
    {
        switch(sign)
        {
        case SIGINT:
            //SIGINT默认行为是退出进程
            printf("SIGINT signal
    ");
            exit(0);
            break;
        case SIGALRM:
            //SIGALRM默认行为是退出进程
            printf("SIGALRM signal
    ");
            alarm(5);
            break;
        case SIGKILL:
            printf("SIGKILL signal
    ");
            break;
        }
    }
    
    int main(int arg, char *args[])
    {
        signal(SIGINT,catch_signal);
        signal(SIGALRM,catch_signal);
        signal(SIGKILL,catch_signal);
        int i=0;
        //永远循环的alarm信号
        alarm(5);
        while(1)
        {
            printf("hello god  %d
    ",i++);
            sleep(1);
        }
        return 0;
    }
    abort函数
    void abort(void);
    该函数发送SIGABRT信号给调用进程,进程不应该忽略这个信号。
    即使进程捕捉到SIGABRT这个信号,进程还是会异常退出
    让进程捕捉SIGABRT的意图是在进程终止前由其执行所需的清理操作。
    sleep函数
    unsigned int sleep(unsigned int seconds);
    参数seconds指定了睡眠时间。
    超过seconds制定时间,函数返回。
    嗲用进程捕捉到一个信号并从信号处理程序返回。
    sleep()函数只要捕捉到一个信号就会终止sleep()函数。
    作业控制信号
    --SIGCHID     子进程已停止或终止
    --SIGCONT      如果进程已经停止,使其继续运行
    --SIGSTOP      停止信号,不能被捕捉或者忽略
    --SIGTIN       后台进程组成员读控制终端
    --SIGTTOU      后台进程组成员写到控制终端
    除了SIGCHLD意外,大多数程序并不处理这些信号。
    shell程序一般需要处理这些信号。
    信号用于大多复杂的应用程序中。
    理解信号处理对于Linux变成非常重要。
  • 相关阅读:
    病毒软件测试代码
    如何将WIN安全设置重置回默认值
    今天值班非常不爽。
    FTP命令(2)
    WORD操作
    DELPHI事务
    DELPHI一些常用的技巧
    钩子学习心得
    (转 )Delphi指针如何指向使用with开域语句创建的无名组件对象
    WebBrowser 操作记要 (DELPHI)
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/5847232.html
Copyright © 2011-2022 走看看