当前位置: 首页 > news >正文

做网站怎么弄网页设计公司网站设计

做网站怎么弄,网页设计公司网站设计,wordpress主题怎么使用教程,wordpress js合并阅读导航 引言一、信号捕捉1. 内核实现信号捕捉过程2. sigaction() 函数#xff08;1#xff09;函数原型#xff08;2#xff09;参数说明#xff08;3#xff09;返回值#xff08;4#xff09;函数使用 二、可重入函数与不可重入函数1. 可重入函数条件2. 不可重入函… 阅读导航 引言一、信号捕捉1. 内核实现信号捕捉过程2. sigaction() 函数1函数原型2参数说明3返回值4函数使用 二、可重入函数与不可重入函数1. 可重入函数条件2. 不可重入函数特征 三、volatile关键字温馨提示 引言 在Linux系统中信号是进程之间通信的重要方式之一。前面的两篇文章已经介绍了信号的产生和保存本篇文章将进一步探讨信号的捕捉、处理以及使用sigaction()函数的方法。信号捕捉是指进程在接收到信号时采取的行动而信号处理则是指对接收到的信号进行适当的处理逻辑。通过使用sigaction()函数我们可以在程序中设置对特定信号的处理方式从而实现更加灵活和精确的信号处理机制。本文将详细介绍信号捕捉的原理和使用方法以及sigaction()函数的具体用法帮助读者更好地理解和应用信号处理的相关知识。无论是开发基于Linux的应用程序还是进行系统级编程信号处理都是一个至关重要的主题相信通过学习本文您将对信号处理有更深入的了解。 一、信号捕捉 1. 内核实现信号捕捉过程 当信号的处理动作是用户自定义函数并且在信号到达时调用该函数这被称为捕捉信号。由于信号处理函数的代码运行在用户空间处理过程可能会比较复杂下面举一个例子来说明 用户程序注册了处理函数sighandler来捕捉SIGINT信号。当前正在执行main函数时若发生中断或异常导致切换到内核态。在中断处理完成后在返回用户态执行main函数之前检测到有SIGINT信号递达。内核决定在返回用户态后不恢复main函数的上下文继续执行而是调用sighandler函数。sighandler函数和main函数使用不同的堆栈空间它们之间不存在调用和被调用的关系是两个独立的控制流程。sighandler函数执行完毕后会自动执行特殊的系统调用sigreturn再次进入内核态。如果没有新的信号递达此次返回用户态将会恢复main函数的上下文并继续执行。 2. sigaction() 函数 sigaction()函数是一个用于设置信号处理函数的系统调用。它允许用户程序指定对特定信号的处理方式包括捕捉信号、忽略信号或使用默认处理方式。 1函数原型 int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);2参数说明 signum指定要设置处理方式的信号编号。act指向一个struct sigaction结构体用于设置新的信号处理方式。oldact可选参数指向一个struct sigaction结构体用于保存之前的信号处理方式。 ⭕struct sigaction结构体定义如下 struct sigaction {void (*sa_handler)(int);void (*sa_sigaction)(int, siginfo_t *, void *);sigset_t sa_mask;int sa_flags;void (*sa_restorer)(void); };⭕该结构体的主要成员包括 sa_handler指定信号处理函数的地址可以是一个函数指针或者是SIG_IGN表示忽略信号或SIG_DFL表示使用默认处理方式。sa_sigaction用于指定信号处理函数的扩展形式可以获取更多关于信号的信息如发送信号的进程ID等。sa_mask指定一个信号屏蔽集当进入信号处理函数时会将这个屏蔽集与当前进程的信号屏蔽字进行按位或操作从而阻塞其他指定的信号。sa_flags用于设置一些标志位如SA_RESTART表示在信号处理函数返回后自动重启被中断的系统调用。sa_restorer已废弃的字段现在不再使用。 3返回值 sigaction()函数返回值为0表示操作成功-1表示出现了错误。如果发生错误可以通过errno变量获取错误码。常见的错误码包括 EINVAL指定的信号编号无效或者提供的struct sigaction结构体无效。ENOENT指定的信号编号不存在。 4函数使用 使用sigaction()函数进行信号处理的一般步骤如下 创建一个struct sigaction结构体对象并根据需要设置其中的成员特别是sa_handler或sa_sigaction成员来指定信号处理函数。调用sigaction()函数传入要设置处理方式的信号编号、指向上述结构体对象的指针以及可选的保存之前处理方式的结构体指针。根据sigaction()函数的返回值判断操作是否成功。 下面是一个简单的C语言示例演示如何使用sigaction()函数来捕获和处理SIGINT信号即Ctrl C #include stdio.h #include stdlib.h #include signal.h #include unistd.hvoid sigint_handler(int signo) {printf(Caught SIGINT, exiting...\n);exit(1); }int main() {struct sigaction sa;// 设置信号处理函数为sigint_handlersa.sa_handler sigint_handler;// 清空sa_mask即不阻塞任何其他信号sigemptyset(sa.sa_mask);// 设置一些标志位这里使用默认值0sa.sa_flags 0;// 注册对SIGINT信号的处理方式if (sigaction(SIGINT, sa, NULL) -1) {perror(sigaction);return 1;}printf(Press CtrlC to send a SIGINT...\n);// 进入一个无限循环等待信号while (1) {sleep(1);}return 0; }在这个示例中首先定义了一个名为sigint_handler的函数用于处理SIGINT信号。然后在main函数中创建了一个struct sigaction对象sa并设置了其中的成员包括sa_handler指向sigint_handler函数地址sa_mask为空sa_flags为0。接着调用sigaction()函数注册对SIGINT信号的处理方式。最后进入一个无限循环等待信号的到来。 当用户按下CtrlC时会发送SIGINT信号程序会捕获该信号并调用sigint_handler函数进行处理打印一条消息并退出程序。这样就实现了对SIGINT信号的自定义处理。 二、可重入函数与不可重入函数 ⭕main函数调用insert函数向一个链表head中插入节点node1插入操作分为两步刚做完第一步的时候因为硬件中断使进程切换到内核再次回用户态之前检查到有信号待处理于是切换到sighandler函数。sighandler也调用insert函数向同一个链表head中插入节点node2插入操作的两步都做完之后从sighandler返回内核态再次回到用户态就从main函数调用的insert函数中继续 往下执行先前做第一步之后被打断,现在继续做完第二步。结果是 main函数和sighandler先后向链表中插入两个节点而最后只有一个节点真正插入链表中了。 ⭕像上例这样insert函数被不同的控制流程调用有可能在第一次调用还没返回时就再次进入该函数这称为重入。insert函数访问一个全局链表有可能因为重入而造成错乱。像这样的函数称为不可重入函数反之如果一个函数只访问自己的局部变量或参数则称为可重入(Reentrant) 函数。想一下为什么两个不同的控制流程调用同一个函数,访问它的同一个局部变量或参数就不会造成错乱? 1. 可重入函数条件 ✅可重入函数必须满足以下条件 不使用全局变量或静态变量或者只读取这些变量的值。 不修改非本地的内存区域或者仅修改线程本地的内存区域。 不调用可能导致线程挂起或阻塞的函数如sleep()和wait()等。 一些示例可重入函数包括memcpy()、strlen()、sprintf()、strtok_r()等。 注意为了确保函数的可重入性可以使用线程安全的函数或使用锁或其他同步机制来保护共享资源。同时应该避免在函数中使用全局变量和静态变量并尽可能将数据和状态存储在本地变量中。 2. 不可重入函数特征 ✅不可重入函数通常具有以下特征 使用全局变量或静态变量或者修改非本地的内存区域。 调用可能导致线程挂起或阻塞的函数。 依赖于某些外部状态或资源。 一些示例不可重入函数包括printf()、scanf()、malloc()、signal()等。 注意在信号处理程序中只能使用可重入函数。由于信号处理程序执行时可能会中断主程序的正常执行流程因此不能使用不可重入函数否则可能会导致意外行为或安全问题。 三、volatile关键字 在C和C中volatile用于告诉编译器不要对该变量进行优化以确保每次访问该变量都从内存中读取或写入。 volatile关键字通常用于以下两种情况 并发访问当多个线程或多个任务并发地访问同一个变量时为了避免出现数据竞争和意外的优化行为可以使用volatile关键字修饰变量。这样可以确保每次访问都从内存中读取或写入而不是依赖于编译器的优化策略。 中断处理在嵌入式系统或操作系统开发中中断处理程序通常需要访问硬件寄存器或共享变量。由于中断可能在任何时间发生编译器可能会对变量进行优化导致不正确的结果。通过使用volatile关键字修饰这些变量可以确保每次访问都是实时的不受编译器的优化干扰。 在信号处理程序中volatile关键字可以用于告诉编译器不要对某些变量进行优化。由于信号处理程序执行时可能会中断主程序的正常执行流程因此编译器可能会错误地优化某些变量或表达式导致程序行为异常。 正如下面这个示例 #include stdio.h #include signal.hsig_atomic_t flag 0;void handle_signal(int signum) {flag 1; }int main() {signal(SIGINT, handle_signal);while (1) {if (flag) {printf(Received SIGINT signal, exiting...\n);break;}}return 0; }优化情况下键入 CTRL C ,2号信号被捕捉执行自定义动作修改 flag1 但是 while 条件依旧满足,进程继续运行但是很明显flag肯定已经被修改了但是为何循环依旧执行很明显 while 循环检查的flag并不是内存中最新的flag这就存在了数据二异性的问题。 while 检测的flag其实已经因为优化被放在了CPU寄存器当中。如何解决呢很明显需要 volatile #include stdio.h #include signal.hvolatile sig_atomic_t flag 0; //使用了volatile关键字编译器不会对它进行优化void handle_signal(int signum) {flag 1; }int main() {signal(SIGINT, handle_signal);while (1) {if (flag) {printf(Received SIGINT signal, exiting...\n);break;}}return 0; } 在上面的示例中定义了一个名为flag的volatile sig_atomic_t类型变量用于表示是否收到了SIGINT信号。在主程序中进入一个无限循环检查flag变量是否被设置为1。如果收到SIGINT信号信号处理程序会将flag变量设置为1从而跳出循环并退出程序。由于flag变量被声明为volatile关键字编译器不会对它进行优化确保每次访问都从内存中读取或写入。这样可以避免由于编译器优化导致的意外行为。 注意在信号处理程序中只有少量的函数和表达式可以安全地使用。具体来说只有那些不分配内存或锁定全局资源的函数和表达式才能被安全地使用。为了确保信号处理程序的可重入性和线程安全性应该尽可能避免在信号处理程序中使用非安全函数和表达式。 温馨提示 感谢您对博主文章的关注与支持如果您喜欢这篇文章可以点赞、评论和分享给您的同学这将对我提供巨大的鼓励和支持。另外我计划在未来的更新中持续探讨与本文相关的内容。我会为您带来更多关于Linux以及C编程技术问题的深入解析、应用案例和趣味玩法等。如果感兴趣的话可以关注博主的更新不要错过任何精彩内容 再次感谢您的支持和关注。我们期待与您建立更紧密的互动共同探索Linux、C、算法和编程的奥秘。祝您生活愉快排便顺畅
http://www.hkea.cn/news/14392141/

相关文章:

  • 网站推广方式推荐用php做网站需要什么
  • 哪里有建站代理加盟网络空间服务商
  • 有没有免费的推广网站页面设计总结
  • 自己怎么建个网站赚钱吗阿里云免费网站备案
  • 做淘客的网站都有哪几个哪个网站可以做纸箱
  • 单机网页游戏网站微网站开发
  • 网站产品二级分类网页设计公司未来三年规划费用
  • 前端网站开发框架沈阳大型网站设计公司
  • 邯郸建设局公开网站公司网站建立教程
  • 东城网站建设公司360建站公司
  • 百度注册新账号seo搜索引擎优化什么意思
  • 建设论坛网站步骤百度开发者
  • 微网站如何做微信支付宝支付宝支付宝在设计赚钱的网站
  • 设计制作个人网站地产网站建设方案
  • 公司网站怎么做网站备案珠海建设局网站首页
  • 手机网站怎么搜索引擎网站开发视频会议插件
  • 廊坊哪里有做网站的seo网站优化推广教程
  • 临沂百度网站推广做网站专业公司
  • 大型网站建设网站推广汽车网站排行榜前十名
  • 成都哪家网站建设强电商网站设计的原则
  • 网站开发著作权微信公众号怎么做网站链接
  • 科技公司建设网站百度推广建设网站是不是合发
  • 一流的南昌网站建设wordpress模板手机
  • 建设一个网站需要什么技术指标qq音乐插件 wordpress
  • 网站开发与管理心得体会山西住房建设厅官方网站
  • 北京低价网站建设怎么样用ps做网站
  • 网站建设的案例沈阳建设网站服务公司
  • 网站建设教程网北京网站设计公司哪儿济南兴田德润简介
  • 网站开发怎么对接客户app开发公司介绍
  • 合肥平台网站建设网站建设简介电话