select和pselect的关于信号打断的实验

news2024/11/17 22:36:36

select和pslect的man手册 

SELECT(2)                                                          Linux Programmer's Manual                                                         SELECT(2)

NAME
       select, pselect, FD_CLR, FD_ISSET, FD_SET, FD_ZERO - synchronous I/O multiplexing

SYNOPSIS
       /* According to POSIX.1-2001, POSIX.1-2008 */
       #include <sys/select.h>

       /* According to earlier standards */
       #include <sys/time.h>
       #include <sys/types.h>
       #include <unistd.h>

       int select(int nfds, fd_set *readfds, fd_set *writefds,
                  fd_set *exceptfds, struct timeval *timeout);

       void FD_CLR(int fd, fd_set *set);
       int  FD_ISSET(int fd, fd_set *set);
       void FD_SET(int fd, fd_set *set);
       void FD_ZERO(fd_set *set);

       #include <sys/select.h>

       int pselect(int nfds, fd_set *readfds, fd_set *writefds,
                   fd_set *exceptfds, const struct timespec *timeout,
                   const sigset_t *sigmask);

最大的区别在于pselect的最后一个参数const sigset_t *sigmask,看名字应该是信号屏蔽,现在分别写一个select和一个pselect对于信号的反应。

测试一:select测试代码

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/select.h>
#include <unistd.h>
#include <time.h>
#include <string.h>
#include <signal.h>
#include <errno.h>

#define _DEBUG_INFO
#ifdef _DEBUG_INFO
#define DEBUG_INFO(format, ...) printf("%s:%s:%d -- "format"\n" \
,__FILE__,__func__,__LINE__ \
, ##__VA_ARGS__)
#else
#define DEBUG_INFO(format, ...)
#endif

#define _DEBUG_PRINT
#ifdef _DEBUG_PRINT
#define DEBUG_PRINT(format,...)	printf(format,##__VA_ARGS__)	
#else
#define DEBUG_PRINT(format,...)
#endif

void sig_func(int sig){
    DEBUG_INFO(" sig = %d", sig);
}

int main(int argc, char *argv[])
{
    fd_set rfds;
    int retval;
    char buf[100];
    signal(SIGINT, sig_func);

    FD_ZERO(&rfds);
    FD_SET(0,&rfds);
select_pos:
    retval = select(1,&rfds,NULL,NULL,NULL);
    if(retval == -1){
        if(errno == EINTR){
            DEBUG_INFO("get a signal");
            exit(0);
        }
    }
    read(0,buf,sizeof(buf));
    goto select_pos;

    DEBUG_INFO("bye bye.");
    return 0;
}

测试:

 实验解析:

当按下CTRL+C时,select返回-1,此时errno的值是EINTR,表示select被信号打断。

测试二:pselect的最后一个参数设置为NULL

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/select.h>
#include <unistd.h>
#include <time.h>
#include <string.h>
#include <signal.h>
#include <errno.h>

#define _DEBUG_INFO
#ifdef _DEBUG_INFO
#define DEBUG_INFO(format, ...) printf("%s:%s:%d -- "format"\n" \
,__FILE__,__func__,__LINE__ \
, ##__VA_ARGS__)
#else
#define DEBUG_INFO(format, ...)
#endif

#define _DEBUG_PRINT
#ifdef _DEBUG_PRINT
#define DEBUG_PRINT(format,...)	printf(format,##__VA_ARGS__)	
#else
#define DEBUG_PRINT(format,...)
#endif

void sig_func(int sig){
    DEBUG_INFO(" sig = %d", sig);
}

int main(int argc, char *argv[])
{
    fd_set rfds;
    int retval;
    char buf[100];
    signal(SIGINT, sig_func);

    FD_ZERO(&rfds);
    FD_SET(0,&rfds);
select_pos:
    retval = pselect(1,&rfds,NULL,NULL,NULL,NULL);
    if(retval == -1){
        if(errno == EINTR){
            DEBUG_INFO("get a signal");
            exit(0);
        }
    }
    read(0,buf,sizeof(buf));
    goto select_pos;

    DEBUG_INFO("bye bye.");
    return 0;
}

实验解析:

 

此时的pselect和测试一的select效果等价。

实验三: pselect的最后一个参数设置为有效值

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/select.h>
#include <unistd.h>
#include <time.h>
#include <string.h>
#include <signal.h>
#include <errno.h>

#define _DEBUG_INFO
#ifdef _DEBUG_INFO
#define DEBUG_INFO(format, ...) printf("%s:%s:%d -- "format"\n" \
,__FILE__,__func__,__LINE__ \
, ##__VA_ARGS__)
#else
#define DEBUG_INFO(format, ...)
#endif

#define _DEBUG_PRINT
#ifdef _DEBUG_PRINT
#define DEBUG_PRINT(format,...)	printf(format,##__VA_ARGS__)	
#else
#define DEBUG_PRINT(format,...)
#endif

void sig_func(int sig){
    DEBUG_INFO(" sig = %d", sig);
}

int main(int argc, char *argv[])
{
    fd_set rfds;
    int retval;
    char buf[100];
    sigset_t blockset;
    signal(SIGINT, sig_func);    

    FD_ZERO(&rfds);
    FD_SET(0,&rfds);
    sigemptyset(&blockset);
    sigaddset(&blockset,SIGINT);
select_pos:
    retval = pselect(1,&rfds,NULL,NULL,NULL,&blockset);
    if(retval == -1){
        if(errno == EINTR){
            DEBUG_INFO("get a signal");
            exit(0);
        }
        perror("pselect");
        return -1;
    }
    int len = read(0,buf,sizeof(buf));
    DEBUG_INFO("len = %d",len);
    for(int i = 0;i < len;i++){
        printf("%d,",buf[i]);
    }
    sigemptyset(&blockset);
    printf("\n");
    goto select_pos;

    DEBUG_INFO("bye bye.");
    return 0;
}

测试过程:

实验解析 

因为SIGINT被屏蔽,第一次按下CTRL+C时,pselect并不会被打断,输入一些字符,让pselect执行一次,通过sigemptyset(&blockset);解除屏蔽,第二次按下CTRL+C时,pselect被打断,并返回-1,errno返回值为EINTR。

小结 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/692295.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【HDFS实战】HDFS联合(联邦)集群的发展史

HDFS联合集群的发展史 文章目录 HDFS联合集群的发展史HDFS原始架构方案一 HDFS Federation方案二 ViewFs方案三 HDFS Router-based Federation常用命令常用配置RPC serverConnection to the NamenodesAdmin serverHTTP ServerState StoreRoutingNamenode monitoring 版本相关is…

nestJS打印多层对象以及铺平金额类型

console.dir(ret, { depth: 3 }); 金额是Decimal类型不好显示 Logger.verbose(JSON.stringify(ret, null, 2)); 利用JSON.stringify参数格式化 null: 不对数据进行提取&#xff0c; 2&#xff1a;缩进两个空格&#xff0c; 效果是直接帮忙平铺金额对象

java.lang.IllegalStateException Unable to find a @SpringBootConfiguration代码报错

文章目录 一. 问题场景二. 报错原因三. 解决方案 一. 问题场景 使用idea基于springBoot的项目进行单元测试时&#xff0c;出现异常&#xff0c;如下所示&#xff1a; Test ignored.java.lang.IllegalStateException: Unable to find a SpringBootConfiguration, you need to …

【电源专题】案例:电池保护芯片有是否能向0V电池充电的功能的区别

本案例发生在实际的工作之中。案例是这样的,有些产品因为各种原因没有按规范将电池与设备断开,而是插入机器(存在1mA的静态功耗)中并存放在仓库里2年后发现产品无法开机使用,并且电池无法充电。更换新的电池后运行正常,所以认定为是电池的问题。 可是为什么电池无法充电呢…

学妹:怎样才能设计出优秀的测试用例?

这篇文章我们主要聊一下测试工程师最通用的也是最根本的技能&#xff0c;测试用例的设计能力。 测试用例 测试用例是通过使用在测试计划中确定的测试技术&#xff0c;对于已确定的测试条件进行逐步推敲&#xff0c;精炼而设计出来的重点说明如何具体操作产生何种结果的文档。…

(免费分享)基于springboot,vue高校就业系统

管理员&#xff1a;10086/123 学生&#xff1a;10087/123 企业&#xff1a;10070/123 辅导员&#xff1a;10090/123 项目描述 高校就业管理系统 学生 : 个人信息、查看企业岗位信息、简历信息管理、我的应聘 辅导员 : 学生信息管理、三方协议书审核、查看班级就业统计信息 企…

App启动流程分析(一)

一、App启动涉及到的三个进程 1、Launcher进程&#xff1a;负责接收用户点击屏幕的事件&#xff0c;它其实就是一个Activity&#xff0c;屏幕上的各种Icon就是这个Activity中的Button&#xff0c;当点击Icon时&#xff0c;会触发启动App的流程。 2、SystemServer进程&#xff…

新手小白学JAVA_IDEA修改编辑与控制台字体大小

很多小白在刚刚使用IDEA的时候还不是很熟练 本文主要给大家提供一些使用的小技巧&#xff0c;希望能帮助到你 1.改变编辑窗口字体大小 1.1 将字体大小设置为固定值 我们可以将编辑窗口的字体大小设置为固定值 1.2 动态改变字体的大小 我们还可以通过Ctrl鼠标滚轮改变编辑窗口…

微信小程序怎么制作自己的小程序

小程序制作是指通过工具或开发语言制作微信平台上的小型应用程序&#xff0c;具有轻量、易用、无需下载安装等优点。随着移动互联网的飞速发展&#xff0c;小程序已经成为了各种企业和个人展示自己、提供服务的重要手段之一。 小程序制作的好处 小程序可以提高品牌曝光度。在…

SpringBoot + 规则引擎 URule,真的太强悍了!

一、背景 前段时间&#xff0c;在做项目重构的时候&#xff0c;遇到很多地方需要做很多的条件判断。当然可以用很多的if-else判断去解决&#xff0c;但是当时也不清楚怎么回事&#xff0c;就想玩点别的。于是乎&#xff0c;就去调研了规则引擎。 当然&#xff0c;市面上有很多…

Springboot 中RESTtemplate的使用

目录 一 概述 二 应用 1.get请求 2.post请求 一 概述 RESTtemplate提供了http请求连接的功能。spring 框架提供的 RestTemplate 类可用于在应用中调用 rest 服务&#xff0c;它简化了与 http 服务的通信方式&#xff0c;统一了 RESTful 的标准&#xff0c;封装了 http 链接…

行业报告 | 智能教育发展蓝皮书(下)

原创 | 文 BFT机器人 核心观点 Core point 在教育数字化转型的背景下&#xff0c;积极探索智能技术助力教学减负增效的实践路径&#xff0c;对于深化教育教学改革&#xff0c;促进学生全面发展、健康成长具有重要现实意义。 03 智能技术助力教学设计 教学设计以解决实际的教学…

【半监督语义分割 2023 CVPR】CCVC

【半监督语义分割 2023 CVPR】CCVC 论文题目&#xff1a;Conflict-Based Cross-View Consistency for Semi-Supervised Semantic Segmentation 中文题目&#xff1a;半监督语义分割的基于冲突的交叉视图一致性 论文链接&#xff1a;https://arxiv.org/abs/2303.01276 论文代码&…

Visual Basic 6 25 周年

Visual Basic 6.0 是 Visual Basic“经典”的最后一个版本&#xff08;VB.NET 之前的版本&#xff09;。它是迄今为止 32 位 Windows 95/NT 及更高版本最流行的版本。它非常受欢迎&#xff0c;并且仍在许多公司中使用。它于 1998 年中发布&#xff0c;与 5.0 版本相比在多个方面…

mysql-数据迁移

文章目录 1. 物理迁移1. 迁移前&#xff0c;配置mysql的输出目录1. 查看mysql的输出目录2. 修改mysql的输出目录 2. 文件迁移 1. 物理迁移 1. 迁移前&#xff0c;配置mysql的输出目录 1. 查看mysql的输出目录 在安装MySQL的会限制了导入与导出的目录权限。只允许在规定的目录…

基于.net core的微信小程序接入微信支付系列之环境搭建(1)

前言&#xff1a;c#语言本身是一门非常优雅的语言&#xff0c;但是在腾讯的api文档里面并不受到待见&#xff0c;所以只能靠自己看文档来逐步摸索&#xff0c;微信支付的逻辑看起来很复杂&#xff0c;其主要原因在于腾讯写文档的人可能是学体育专业的&#xff0c;简单的逻辑非要…

android Q /R/S/T onTopResumedActivityChanged方法解析

疑问背景&#xff1a; 在Android Q高版本&#xff0c;发现经常通过events日志来看Activity生命周期的时候&#xff0c;经常看到如下打印&#xff1a; 06-27 12:02:07.091 4812 4812 I wm_on_top_resumed_gained_called: [227500858,com.android.launcher3.uioverrides.Quic…

【LeetCode】动态规划 刷题训练(五)

文章目录 剑指 Offer II 091. 粉刷房子题目解析状态转移方程完整代码 309. 最佳买卖股票时机含冷冻期题目解析状态转移方程持有股票保持卖出股票卖出股票冷冻期 完整代码 714. 买卖股票的最佳时机含手续费题目解析状态转移方程f[i]状态转移方程g[i]状态转移方程 完整代码 剑指 …

强化学习从基础到进阶-常见问题和面试必知必答[7]:深度确定性策略梯度DDPG算法、双延迟深度确定性策略梯度TD3算法详解

【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧&#xff08;调参、画图等、趣味项目实现、学术应用项目实现 专栏详细介绍&#xff1a;【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧…

最大收益(搜索好题)

题目描述 给一行n个数&#xff0c;每次可以取出行首或者行末的数&#xff0c;如果数ai是第j次取出的&#xff0c;可以得到ai*j的收益&#xff0c;求最大的总收益&#xff1b; 输入描述 Line 1: 整数 N&#xff08;1<N<2000&#xff09; Lines 2…N1: 第i个数的 a(i)&…