IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Linux信号编程 -> 正文阅读

[系统运维]Linux信号编程

信号编程

信号低级编程实战

通过信号来kill进程

代码:

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

void handler(int signum)
{
        printf("get signum=%d\n",signum);
        switch(signum){
                case 2:
                        printf("SIGINT\n");
                        break;
                case 9:
                        printf("SIGKILL\n");
                        break;
                case 10:
                        printf("SIGUSR1\n");
                        break;

        }
        printf("never quit\n");

}

int main()
{
        signal(SIGINT,handler);
        signal(SIGKILL,handler);
        signal(SIGUSR1,handler);
        while(1);
        return 0;
}

通过ctrl + C 是结束不了该进程的

通过ps -aux | grep Pro 来查询当前进程的pid

然后运行以下代码:

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<signal.h>

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);

        sprintf(cmd,"kill -%d %d",signum,pid);
        system(cmd);
        return 0;
}

执行上方代码,命令参数为:./a.out 9 (进程pid)

然后就kill掉该进程了

执行结果如下:

执行第一个代码后

在这里插入图片描述

阻塞在这里

然后开启另外一个终端,查询当前pid值,我的程序命名为Pro

ps -aux | grep Pro

在这里插入图片描述

然后运行第二个代码

在这里插入图片描述

就kill掉该进程了。

信号携带消息高级编程实战

函数原型

NAME
sigaction, rt_sigaction - examine and change a signal action

SYNOPSIS
#include <signal.h>

   int sigaction(int signum, const struct sigaction *act,
                 struct sigaction *oldact);

Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

   sigaction(): _POSIX_C_SOURCE

   siginfo_t: _POSIX_C_SOURCE >= 199309L

DESCRIPTION
The sigaction() system call is used to change the action taken by a process on
receipt of a specific signal. (See signal(7) for an overview of signals.)

   signum specifies the signal and can  be  any  valid  signal  except  SIGKILL  and  SIGSTOP.

   If  act  is non-NULL, the new action for signal signum is installed from act.  If oldact is non-NULL, the previous action is saved in oldact.

The sigaction structure is defined as something like:

       struct sigaction {
           void     (*sa_handler)(int);
           void     (*sa_sigaction)(int, siginfo_t *, void *);
           sigset_t   sa_mask;
           int        sa_flags;
           void     (*sa_restorer)(void);
       };

   On some architectures a union is involved: do not assign to both  sa_handler  and sa_sigaction.

代码如下:

send.c

#include<stdio.h>
#include<signal.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>

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

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

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


        return 0;
}

signal.c

#include<stdio.h>
#include<stdlib.h>
#include<signal.h>
#include<unistd.h>
#include<sys/types.h>

void handler(int signum,siginfo_t *info ,void *context)
{
        printf("get signum = %d\n",signum);
        if(context != NULL){
                printf("get data = %d\n",info->si_int);
                printf("get data =%d\n",info->si_value.sival_int);
                printf("from %d\n",info->si_pid);
        }

}


int main()
{
        struct sigaction act;
        printf("pid = %d\n",getpid());

        act.sa_sigaction = handler;
        act.sa_flags = SA_SIGINFO;//be able to get messages
        sigaction(SIGUSR1,&act,NULL);
        while(1);

        return 0;
}

发送信号函数原型

NAME
sigqueue - queue a signal and data to a process

SYNOPSIS
#include <signal.h>

   int sigqueue(pid_t pid, int sig, const union sigval value);

Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

   sigqueue(): _POSIX_C_SOURCE >= 199309L

DESCRIPTION
sigqueue() sends the signal specified in sig to the process whose PID is given in pid. The permissions required to send a signal are the same as for kill(2). As with kill(2), the null signal (0) can be used to check if a process with a given PID exists.

   The value argument is used to specify an accompanying item  of  data  (either  an  integer  or  a  pointer  value) to be sent with the signal, and has the following
   type:

union sigval {
int sival_int;
void *sival_ptr;
};

   If the receiving process has installed  a  handler  for  this  signal  using  the
   SA_SIGINFO  flag  to  sigaction(2), then it can obtain this data via the si_value
   field of the siginfo_t structure passed as the second argument  to  the  handler.
   Furthermore, the si_code field of that structure will be set to SI_QUEUE.

RETURN VALUE
On success, sigqueue() returns 0, indicating that the signal was successfully queued to the receiving process. Otherwise, -1 is returned and errno is set to indicate the error.

ERRORS
EAGAIN The limit of signals which may be queued has been reached. (See signal(7) for further information.)

执行结果如图:

在这里插入图片描述

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-10-11 17:55:43  更:2021-10-11 17:55:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 17:32:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码