C问题:求教:R.Stevens 中的一个问题(kingofark)

kingofark kingofark 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
[问题名称]:

Kingofark求教:R.Stevens<UNIX环境高级编程>中的一个问题(kingofark)


[问题的环境]:

我的机子:Red Hat Linux 7.1 (Kernel 2.4.2-2)


[问题的地点]:

机械工业出版社:Richard Stevens《UNIX环境高级编程》第10章 信号

第229页至第230页:程序10-15 保护临界区不被信号中断


[问题的提出]:

书中说到,

“运行程序10-15得到下面的输出:

$ a.out
in critical region: SIGINT
^? 键入自定义的中断字符
in sig_int: SIGINT
after return from sigsuspend: SIGINT”

本程序演示了如何在临界区(即代码中的 critical region 那个位置)屏蔽掉一些中断信号。但是,我阅读到这里的时候,对书中所显示的输出结果很不满意,因为三条输出竟然都是SIGINT。

按照程序的本意,结果中的第一条(即“in critical region:”)的输出应该是和第三条(即“after return from sigsuspend:”)的输出是一样的(这两条显示的都是临界区中被屏蔽的中断信号),而它们并不一定与第二条(即“in sig_int:”)的输出相同。

然而在书中,却恰好是一个三条输出结果都相同的例子。我觉得对于我这样一个初学者来说,即使没有看不懂,至少也是令人觉得很不爽——这样的输出结果,非要让人来一个完全不必要的阿Q式“凡事须得研究才能明白”的研究才能消除对其的迷惑。

于是,我对程序10-15作了一点小的修改。只要让临界区多屏蔽一个中断信号,那么第一、三条的输出结果就会与第二条的输出结果不同,从而使得整个程序示例的输出结果清晰明了,明白无误。具体改动:只要在一开始设置newmask信号集的地方(即代码中sigaddset(&newmask,SIGINT);这一句的地方,)再加上一句sigaddset(&newmask,其它中断信号);就可以了。我加上了一句sigaddset(&newmask,SIGUSR1);,得到如下的输出结果:

$ a.out
in critical region: SIGINT SIGUSR1
^? 键入自定义的中断字符
in sig_int: SIGINT
after return from sigsuspend: SIGINT SIGUSR1

这样多好!


[问题的解答]:

毕竟上面的讨论问题是我自己琢磨的,所以也不敢保证是对的,特此希望各位有兴趣的同胞也看看,有什么问题和想法或者异议,跟我说说,也好让我学习学习。


谢谢!


附:书中的程序10-15代码及相关的代码程序10-10


// -- 程序10-15 ----------------------------------

#include <signal.h>
#include "ourhdr.h"

static void sig_int(int);

int
main(void)
{
sigset_t newmask, oldmask, zeromask;

if (signal(SIGINT, sig_int) == SIG_ERR)
err_sys("signal(SIGINT) error");

sigemptyset(&zeromask);

sigemptyset(&newmask);
sigaddset(&newmask, SIGINT);
/* block SIGINT and save current signal mask */
if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)
err_sys("SIG_BLOCK error");

/* critical region of code */
pr_mask("in critical region: ");

/* allow all signals and pause */
if (sigsuspend(&zeromask) != -1)
err_sys("sigsuspend error");
pr_mask("after return from sigsuspend: ");

/* reset signal mask which unblocks SIGINT */
if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
err_sys("SIG_SETMASK error");

/* and continue processing ... */
exit(0);
}

static void
sig_int(int signo)
{
pr_mask("\nin sig_int: ");
return;
}


//-- 程序10-10 ---------------------------------------

#include <errno.h>
#include <signal.h>
#include "ourhdr.h"

void
pr_mask(const char *str)
{
sigset_t sigset;
int errno_save;

errno_save = errno; /* we can be called by signal handlers */
if (sigprocmask(0, NULL, &sigset) < 0)
err_sys("sigprocmask error");

printf("%s", str);
if (sigismember(&sigset, SIGINT)) printf("SIGINT ");
if (sigismember(&sigset, SIGQUIT)) printf("SIGQUIT ");
if (sigismember(&sigset, SIGUSR1)) printf("SIGUSR1 ");
if (sigismember(&sigset, SIGALRM)) printf("SIGALRM ");
/* remaining signals can go here */
printf("\n");
errno = errno_save;
}
...全文

相关推荐

12、新型MD5双块碰撞研究

本文深入研究了MD5哈希函数的新型双块碰撞问题,详细介绍了MD5的消息处理流程、压缩函数及差分路径理论。基于对MD5在消息扩展和第三轮非线性函数中弱点的分析,采用Stevens算法自主实现了部分差分路径的扩展与连接,成功构造了针对特定消息差异d44的完整差分路径,并给出了具体的双块碰撞示例。同时探讨了该技术的应用场景与潜在风险,提出了替换哈希函数和多重哈希验证等应对措施,指出了未来在差分路径优化和参数选择自动化方面的研究方向。研究表明MD5已不再安全,亟需迁移到更安全的哈希算法。

二进制温柔

科技成果进场交易前,评估备案环节需要准备哪些材料?.docx

科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。

BIZKEEN

人工智能基于类型化方法的训练数据获取与处理体系:构建数据中心化AI治理框架

内容概要:本文从类型化视角系统研究了人工智能训练数据的获取与处理体系,提出应构建多元化、高质量、合规有序的数据供给体系。文章首先分析数据获取的三种类型:来源类型(网络公开抓取、开源数据集、多源协同)、合规性类型(合法性困境与制度供给)以及产业组织类型(“隐身劳动”到多元协作)。随后构建数据处理的类型化体系,包括四方面:阶段类型(从“生语料”到“归档数据集”的五阶段流程)、操作类型(形成包含采集、清洗、标注、脱敏、去重、切片、向量化等在内的“数据操作工具箱”)、范式类型(推动从“模型中心”向“数据中心”的范式转型),以及管理类型(建立覆盖全生命周期的治理框架)。最后指出,AI治理正迈向以数据为中心的新范式,需通过制度完善、产业协同、技术创新与监管强化实现系统性突破。; 适合人群:从事人工智能研发、数据治理、算法合规及相关政策研究的专业人员,尤其适用于AI企业技术管理者、数据科学家、法律合规从业者及政府监管部门人员。; 使用场景及目标:①理解AI训练数据获取的合法路径与产业协作模式;②掌握数据处理的全流程阶段划分与核心技术操作;③推动“数据为中心”的AI开发范式转型;④构建符合法律与伦理要求的全生命周期数据治理体系。; 阅读建议:此资源理论与实践结合紧密,建议读者结合实际项目中的数据采集、清洗、标注与合规流程进行对照学习,并重点关注“数据操作工具箱”与“数据中心AI”范式,以提升数据工程化能力和治理水平。

王大师王文峰

政府科技管理者在推动区域科技创新时,如何精准配置科技成果与产业需求?.docx

科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。

BIZKEEN

基于LADRC控制器(三阶扩张状态观测器)的永磁同步直线电机位置环控制matlab仿真

内容概要:本文详细介绍了基于LADRC控制器(三阶扩张状态观测器)的永磁同步直线电机位置环控制系统的Matlab仿真研究,系统阐述了该先进控制策略在高精度运动控制中的应用。文章围绕LADRC的核心思想——通过扩张状态观测器实时估计并补偿系统内部动态不确定性及外部扰动,从而显著提升控制系统的鲁棒性、抗干扰能力和动态响应性能展开论述。内容涵盖控制器的整体设计架构、三阶扩张状态观测器的数学建模与实现方法、非线性反馈控制律的构建、关键参数的整定策略,并通过Matlab/Simulink搭建完整的仿真模型,与传统PID控制进行了对比实验,充分验证了LADRC在抑制负载扰动、减小跟踪误差、加快响应速度等方面的优越性。; 适合人群:具备自动控制理论基础和Matlab/Simulink仿真经验的电气工程、自动化、机电一体化及相关专业的硕士研究生、博士研究生、科研人员及从事高性能电机驱动系统开发的工程技术人员。; 使用场景及目标:①用于高性能永磁同步直线电机控制系统的设计、分析与性能优化;②作为自抗扰控制(ADRC)及其变体(LADRC)算法的教学案例与科研仿真平台;③深入理解扩张状态观测器的工作机理及扰动补偿机制;④对比研究LADRC与传统PID等线性控制器在动态性能、鲁棒性方面的差异; 阅读建议:建议结合文中详述的仿真模型与参数设置进行动手实践,重点关注扩张状态观测器的设计过程与扰动估计的实时性,通过修改系统参数、引入不同类型的外部负载扰动来测试控制器的鲁棒性,并尝试调整观测器带宽与控制器带宽以观察其对系统性能的影响,从而深化对LADRC核心原理的理解。

荔枝科研社
评论 3
收藏 已收藏
分享
返回顶部
kingofark
C语言 70,039 成员 243,237 内容