linux中信号操作

优秀文章学习连接https://www.jianshu.com/p/f445bfeea40a

#include<signal.h>
#include<stdio.h>
//      typedef void (*sighandler_t)(int);

  //     sighandler_t signal(int signum, sighandler_t handler);



void handler(int signum)
{

        printf("get signum %d\n",signum);

        printf("never quit\n");

}

int main()
{

        signal(SIGINT,handler);

        while(1);
        return 0;
}
~                                                                                                     
~                                                                                                     
~                                                                                                     
~            

按 Ctrl c 不会退出
在这里插入图片描述
增强一下

#include<signal.h>
#include<stdio.h>
//      typedef void (*sighandler_t)(int);

  //     sighandler_t signal(int signum, sighandler_t handler);



void handler(int signum)
{

        printf("get signum %d\n",signum);

        switch(signum){

                case2:printf("SIGINT\n");
                        break;

                case9:printf("SIGKILL\n");
                        break;

                case10:printf("SIGUSR1\n");
                        break;
        }


        printf("never quit");
}

int main()
{

        signal(SIGINT,handler);

        signal(SIGKILL,handler);
        signal(SIGUSR1,handler);


        while(1);
        return 0;
}
~                                                                                                     
~                                                                                                     
~                                                                                                     
~     

发送信号传给pro 执行kill指令

#include<signal.h>
#include<stdio.h>
#include <sys/types.h>
//      typedef void (*sighandler_t)(int);

  //     sighandler_t signal(int signum, sighandler_t handler);




int main(int argc, char **argv)
{
        int signum;
        int pid;


        char cmd[128] = {0};

        signum = atoi(argv[1]);
        pid = atoi(argv[2]);

        printf("num=%d, pid=%d \n",signum,pid);


        kill(pid, signum);

        sprintf(cmd,"kill -%d %d", signum,pid);

        system(cmd);


        printf("send signal ok");


        return 0;

}
~                                                                                                     
~                                                                                                     
~             

在这里插入图片描述
信号如何携带信息编程样例

1.创建信号和信号中存放信息的结构体

#include <signal.h>
#include<stdio.h>
  //     int sigaction(int signum, const struct sigaction *act,
    //                 struct sigaction *oldact);


void handler(int signum, siginfo_t *info, void *context)
{
        printf("ready handler\n");
        printf("get signum:%d \n",signum);


        if(context != NULL){

                printf("get data =%d",info->si_int);
                printf("get data =%d",info->si_value.sival_int);
        }



}



int main()
{
        struct sigaction act;

        printf("create struct signal\n");
        printf("pid = %d\n",getpid());

        act.sa_sigaction = handler;
        act.sa_flags = SA_SIGINFO; //get message
      
        printf("start  action\n");

        sigaction(SIGUSR1,&act,NULL); 
    
        printf("action over\n");          
        while(1);
        return 0;
}   
~                                                                                          
~                                                                                          
~                                                                                          
"NiceSignal.c" 42L

2.向信号中发送信息

#include <signal.h>
#include <stdio.h>



int main(int argc, char **argv)
{

        int signum;
        int pid;

        printf("send ok2\n");

        signum = atoi(argv[1]);
        pid = atoi(argv[2]);

        printf("send ok1\n");
        union sigval value;
        value.sival_int = 100;
        printf("%d,done",getpid());
        printf("send ok\n");
        sigqueue(pid, signum,value);

        printf("send ok3\n");
        return 0;
}

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值