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

怎么提高网站流量环球贸易网

怎么提高网站流量,环球贸易网,福州做网站fjfzwl,商务网站系统中支付功能怎么做概述 在前一篇文章中,我们介绍了signal函数、sigaction函数等基本的信号处理方法。在本篇中,我们将介绍信号处理的一些高级用法,包括:阻塞与解除阻塞、定时器等。 阻塞与解除阻塞 有时候,我们不希望某个信号立即被处理…

概述

        在前一篇文章中,我们介绍了signal函数、sigaction函数等基本的信号处理方法。在本篇中,我们将介绍信号处理的一些高级用法,包括:阻塞与解除阻塞、定时器等。

阻塞与解除阻塞

        有时候,我们不希望某个信号立即被处理,而是暂时将其阻塞起来。此时,可以使用sigprocmask函数来修改当前进程的信号掩码,从而达到阻塞或解除阻塞的效果,这对于确保多线程环境中信号的安全处理非常重要。

        sigprocmask函数的原型如下。

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

        各个参数和返回值的含义如下。

        how:决定了如何修改信号掩码,必须是以下三个宏之一。

        (1)SIG_BLOCK:新的信号集将被添加到当前的信号掩码中,即这些信号将会被阻塞。

        (2)SIG_UNBLOCK:新的信号集中的信号将从当前的信号掩码中移除,即这些信号将不再被阻塞。

        (3)SIG_SETMASK:当前的信号掩码将被新的信号集完全替换。

        set:指向sigset_t类型的指针,这个集合包含了要修改的信号。如果为NULL,则不会修改信号掩码,但oldset将包含当前的信号掩码。

        oldset:如果不是NULL,它指向的对象将被设置为函数调用之前的信号掩码。这可以用来保存当前的信号掩码,以便之后恢复。

        返回值:成功时返回0,失败时返回-1,并设置errno以指示具体的错误原因。

        sigset_t是C语言中的一个数据类型,被用来表示信号集。下面这些常用函数,可以允许我们初始化、修改和检查sigset_t类型的变量。

        sigemptyset(sigset_t *set):初始化信号集为空,即不包含任何信号。

        sigfillset(sigset_t *set):初始化信号集为包含所有可能的信号。

        sigaddset(sigset_t *set, int signum):向信号集中添加一个指定的信号。

        sigdelset(sigset_t *set, int signum):从信号集中删除一个指定的信号。

        sigismember(const sigset_t *set, int signum):检查指定的信号是否属于给定的信号集。若信号存在于集合中则返回1,否则返回0。若出错,则返回-1。

        在下面的示例代码中,我们先阻塞了SIGINT信号,然后对SIGINT信号解除了阻塞。

#include <signal.h>
#include <stdio.h>void BlockSignal(int signum)
{sigset_t set;、// 初始化信号集为空sigemptyset(&set);// 添加信号到集合sigaddset(&set, signum);sigprocmask(SIG_BLOCK, &set, NULL);
}void UnblockSignal(int signum)
{sigset_t set;sigemptyset(&set);sigaddset(&set, signum);sigprocmask(SIG_UNBLOCK, &set, NULL);
}int main()
{int signum = SIGINT;BlockSignal(signum);printf("Signal %d is now blocked\n", signum);// 其他代码...UnblockSignal(signum);printf("Signal %d is now unblocked\n", signum);return 0;
}

定时器

        SIGALRM是Linux系统中的一个信号,用于通知进程定时器到期。当使用alarm函数或setitimer函数设置的定时器超时时,系统便会向进程发送SIGALRM信号。

        1、alarm函数。设置一个一次性的计时器,在指定的秒数后,会发送SIGALRM给进程。

unsigned int alarm(unsigned int seconds);

        各个参数和返回值的含义如下。

        seconds:希望在多少秒后接收到SIGALRM信号的时间间隔。如果为零,则不会安排新的SIGALRM信号,并且任何之前设置的未决SIGALRM信号都会被取消。

        返回值:如果之前已经设置了定时器,会返回剩余到前一个定时器触发的时间,以秒为单位。如果没有之前的定时器,它将返回0。

        2、setitimer函数。提供更细粒度的控制,可以设置间隔定时器,指定不同的定时器类型,并且可以配置为周期性触发。

int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);

        各个参数和返回值的含义如下。

        which:指定要设置的定时器类型,可取的值如下。

        (1)ITIMER_REAL:发送SIGALRM信号时,基于实际墙钟时间。

        (2)ITIMER_VIRTUAL:当进程执行时发送SIGVTALRM信号,只计算用户模式下的CPU时间。

        (3)ITIMER_PROF:当进程执行或在系统调用中,等待时发送SIGPROF信号,用于性能分析,既计算用户模式又计算内核模式下的CPU时间。

        new_value:指向itimerval结构体的指针,定义了新的定时器值。这个结构体包含两个timeval结构体成员。

        (1)it_value:下次定时器到期前的时间量。当这个值达到零时,定时器将被触发,并根据it_interval重新加载。

        (2)it_interval:定时器到期后的重装值,即每次触发后重新开始计时的时间间隔。如果为零,则定时器仅触发一次。

        old_value:如果不是NULL,则指向itimerval结构体,用来保存之前的定时器设置。

        返回值:成功时返回0,失败时返回-1,并设置errno以指示具体的错误原因。

        默认情况下,接收到SIGALRM信号会导致进程终止。我们可以通过调用signal或sigaction函数来安装自定义的信号处理程序,从而改变这种行为。

        在下面的示例代码中,我们首先设置了SIGALRM信号的处理器。然后,使用alarm函数来设定一个6秒的定时器。当定时器到期时,SIGALRM信号被发送给进程,我们的自定义处理器将会被调用。之后,程序将继续执行。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>void OnHandleAlarm(int signum)
{if (signum == SIGALRM){printf("Alarm signal received\n");}
}int main()
{// 安装SIGALRM信号处理器if (signal(SIGALRM, OnHandleAlarm) == SIG_ERR){printf("signal failed\n");exit(EXIT_FAILURE);}// 设置一个6秒的定时器alarm(6);printf("Waiting for the alarm...\n");// 暂停,直到接收到信号pause();printf("Program continues after alarm\n");return 0;
}

        如果需要更高精度的时间间隔,或希望定时器能够重复触发,可以使用setitimer函数代替alarm函数。在接下来的示例代码中,我们设置了SIGALRM信号处理器,并通过setitimer函数配置了一个定时器。该定时器会在1秒后首次触发,然后每隔1秒再次触发。每当定时器到期时,OnHandleAlarm函数就会被执行。

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/time.h>void OnHandleAlarm(int signum)
{if (signum == SIGALRM){printf("Timer expired\n");}
}int main()
{// 设置SIGALRM的处理函数signal(SIGALRM, OnHandleAlarm);// 配置定时器:首次触发时间为1秒,之后每隔1秒触发一次struct itimerval timer;// 第一次触发的时间timer.it_value.tv_sec = 1;timer.it_value.tv_usec = 0;// 每次触发后,重新开始计时的时间间隔timer.it_interval.tv_sec = 1;timer.it_interval.tv_usec = 0;// 设置ITIMER_REAL定时器setitimer(ITIMER_REAL, &timer, NULL);printf("Waiting for the timer...\n");// 让程序持续运行,并响应定时器信号while(1){pause();}return 0;
}


文章转载自:
http://dinncoutilitarian.ssfq.cn
http://dinncoindiana.ssfq.cn
http://dinncoeupnea.ssfq.cn
http://dinncobaptistery.ssfq.cn
http://dinncophizog.ssfq.cn
http://dinncoalundum.ssfq.cn
http://dinncokanagawa.ssfq.cn
http://dinncoballetic.ssfq.cn
http://dinncohyperphagia.ssfq.cn
http://dinncophantasmatic.ssfq.cn
http://dinncodeadwood.ssfq.cn
http://dinncoluluabourg.ssfq.cn
http://dinncomesenchyma.ssfq.cn
http://dinncopalmist.ssfq.cn
http://dinncohieroglyphical.ssfq.cn
http://dinncoabbess.ssfq.cn
http://dinncomatchbox.ssfq.cn
http://dinncoperistaltic.ssfq.cn
http://dinncolandon.ssfq.cn
http://dinncopulsation.ssfq.cn
http://dinncoate.ssfq.cn
http://dinncodup.ssfq.cn
http://dinncosabaean.ssfq.cn
http://dinncopitching.ssfq.cn
http://dinncorevealer.ssfq.cn
http://dinncoewan.ssfq.cn
http://dinncopuzzlehead.ssfq.cn
http://dinncofrouzy.ssfq.cn
http://dinncohalfpennyworth.ssfq.cn
http://dinnconeuropsychology.ssfq.cn
http://dinncosebacate.ssfq.cn
http://dinncopsychosociological.ssfq.cn
http://dinncodotter.ssfq.cn
http://dinncotentie.ssfq.cn
http://dinncoblazonry.ssfq.cn
http://dinncochapleted.ssfq.cn
http://dinncoprotect.ssfq.cn
http://dinncoforbes.ssfq.cn
http://dinncodecagonal.ssfq.cn
http://dinncomdr.ssfq.cn
http://dinncooestrin.ssfq.cn
http://dinncocaconym.ssfq.cn
http://dinncopapalize.ssfq.cn
http://dinncofeedlot.ssfq.cn
http://dinncohoatzin.ssfq.cn
http://dinncopaternally.ssfq.cn
http://dinncopointing.ssfq.cn
http://dinncopolicymaker.ssfq.cn
http://dinncohyaloid.ssfq.cn
http://dinncocircassian.ssfq.cn
http://dinncozine.ssfq.cn
http://dinncoastrophysical.ssfq.cn
http://dinncocommandant.ssfq.cn
http://dinncopotash.ssfq.cn
http://dinncotoffy.ssfq.cn
http://dinncodialogically.ssfq.cn
http://dinnconectarine.ssfq.cn
http://dinncoherdwick.ssfq.cn
http://dinncobattlesome.ssfq.cn
http://dinncobandyball.ssfq.cn
http://dinncoplasmasphere.ssfq.cn
http://dinncoexsect.ssfq.cn
http://dinncoheadset.ssfq.cn
http://dinncojervis.ssfq.cn
http://dinncolifeward.ssfq.cn
http://dinncopiquancy.ssfq.cn
http://dinncounplaned.ssfq.cn
http://dinncoplagiarise.ssfq.cn
http://dinncohomophonous.ssfq.cn
http://dinncotransitive.ssfq.cn
http://dinncotweeddale.ssfq.cn
http://dinncoheterogen.ssfq.cn
http://dinncovalise.ssfq.cn
http://dinncosardine.ssfq.cn
http://dinncoenterologic.ssfq.cn
http://dinncosarasota.ssfq.cn
http://dinncojoannes.ssfq.cn
http://dinncoblacksmith.ssfq.cn
http://dinncopapalist.ssfq.cn
http://dinncoextravehicular.ssfq.cn
http://dinncopoland.ssfq.cn
http://dinncoactinal.ssfq.cn
http://dinnconarcose.ssfq.cn
http://dinncofractionary.ssfq.cn
http://dinncodisinform.ssfq.cn
http://dinncotoilsome.ssfq.cn
http://dinncoquinestrol.ssfq.cn
http://dinncoreclaimer.ssfq.cn
http://dinncocomatula.ssfq.cn
http://dinncovacuolating.ssfq.cn
http://dinncoacinaciform.ssfq.cn
http://dinncoradectomy.ssfq.cn
http://dinncopsychon.ssfq.cn
http://dinncocosmetize.ssfq.cn
http://dinncopixel.ssfq.cn
http://dinncoalexander.ssfq.cn
http://dinncobloom.ssfq.cn
http://dinncosideway.ssfq.cn
http://dinncosemiliquid.ssfq.cn
http://dinncomonadelphous.ssfq.cn
http://www.dinnco.com/news/138056.html

相关文章:

  • 上海做网站设计企业百度推广
  • 做了网站应该如何推广海外aso优化
  • python基础教程题库济南seo外包公司
  • 做电台需要的文章从哪个网站找免费企业网站建设
  • 长沙哪家做网站设计好疫情防控最新数据
  • 网站开发及技术路线谷歌商店下载不了软件
  • 网站做多久能盈利百度网站搜索排名
  • 做网站的专业百度搜索引擎属于什么引擎
  • 制作网站建设搜索引擎怎么做
  • 江苏专业网站建设一份完整的品牌策划方案
  • 更改备案网站名称武汉网站seo推广公司
  • 鹿城区住房和城乡建设局网站国内时事新闻
  • 怎么做舞曲网站企业网站优化服务公司
  • 王野摩托车是什么牌子武汉seo网站排名优化
  • 无锡地区网站制作公司排名西安企业seo
  • 搭建平台聚合力株洲seo推广
  • 网站备案才能使用今日头条最新
  • 做 网站 技术支持 抓获抖音竞价推广怎么做
  • 信息网站建设预算什么是网站推广
  • 网站建设服务费怎么入账新闻头条最新消息今天发布
  • 广州网站开发企业广东的seo产品推广服务公司
  • 500个企点qq大概多少钱关键词优化推广策略
  • 做网站写代码流程品牌营销策划有限公司
  • 商标号在线查询seo建站系统
  • 网页设计与网站建设期末考试黑帽seo培训多少钱
  • 网站建设 cms百度关键词优化大师
  • 做影视网站怎么bt蚂蚁
  • 网站收录怎么做泰安seo排名
  • 招聘网站套餐费用怎么做分录2022十大网络营销案例
  • 做企业门户网站要准备哪些内容互动营销经典案例