wordpress 数据库配置错误,优化设计六年级下册语文答案,wordpress添加按钮,市场营销推广策划信号的基本概念我已经在上一节中简单介绍了#xff0c;大家可以去看我的上一篇博客#xff1a; Unix中的进程和线程-2-CSDN博客 1.信号的产生 kill函数#xff1a; #include signal.h
#include fcntl.h
#includet_stdio.h
//自定义信号处理函数,n为… 信号的基本概念我已经在上一节中简单介绍了大家可以去看我的上一篇博客 Unix中的进程和线程-2-CSDN博客 1.信号的产生 kill函数 #include signal.h
#include fcntl.h
#includet_stdio.h
//自定义信号处理函数,n为信号编号
void handle(int n){printf(this is a test..\n);return;}int main(void){//从父进程继承信号处理函数//采用默认处理方式signal(2,SIG_IGN);//改变2号进程的处理函数忽略2号信号signal(3,handle);//对3号信号使用自定义处理函数pid_t pid fork();if(pid-1)E_MSG(fork,-1);while(1);return 0;
} signal(2,SIG_IGN)使用signal()函数将2号信号通常是SIGINT即CtrlC的处理方式设置为忽略SIG_IGN。这意味着当程序接收到CtrlC时不会终止程序而是忽略该信号。signal(3,handle)将3号信号的处理方式设置为调用自定义的信号处理函数handle。这表示当程序接收到3号信号时例如Ctrl\会执行handle函数中定义的操作。pid_t pid fork();创建一个子进程。if(pid-1)E_MSG(fork,-1);如果fork()调用失败输出错误消息并退出程序。while(1);在这个循环中父进程和子进程都会进入一个无限循环使得程序一直处于运行状态。 这个程序主要演示了信号处理的基本用法以及父子进程之间对信号处理函数的继承。通过signal()函数可以设置特定信号的处理方式可以是忽略该信号、采用默认的处理方式或者调用自定义的信号处理函数。 kill函数的仿写
#includet_stdio.h
#includet_file.h
#include sys/types.h
#include signal.hint main(int argc , char * argv[]){//将命令行的参数转化为整数类型kill (atoi(argv[2]),atoi(argv[1]));return 0;
} alarm函数 alarm函数是一个用于在指定时间后发送信号的函数。它允许你在程序中设置一个定时器当定时器计时时间到达后系统会向当前进程发送一个 SIGALRM 信号。这通常用于实现超时控制或者周期性任务。 以下是 alarm 函数的声明 #include unistd.hunsigned int alarm(unsigned int seconds);alarm 函数接受一个 unsigned int 类型的参数 seconds表示定时器的计时时间单位是秒。当调用 alarm 函数后系统会在指定的秒数之后向当前进程发送 SIGALRM 信号。 如果之前已经设置过定时器调用 alarm 函数会取消之前的定时器并设置新的定时器。如果 seconds 参数为 0则之前设置的定时器会被取消且不会设置新的定时器。 下面是一个简单的示例代码演示了如何使用 alarm 函数实现一个定时器 #include stdio.h
#include unistd.h
#include signal.hvoid handler(int signum) {printf(Received SIGALRM signal.\n);// 处理定时器触发后的逻辑
}int main() {// 注册信号处理函数signal(SIGALRM, handler);printf(Setting up alarm for 5 seconds.\n);// 设置定时器为 5 秒alarm(5);// 进入一个无限循环while (1) {// 这里可以执行一些其他任务// 例如等待用户输入等}return 0;
}在这个示例中首先注册了一个信号处理函数 handler用于处理 SIGALRM 信号。然后调用 alarm(5) 设置了一个定时器时间为 5 秒。当定时器计时时间到达时系统会发送 SIGALRM 信号进而触发信号处理函数 handler在该处理函数中打印了一条消息。 2.信号的暂停 如下 #includestdio.h
#include unistd.h
#includesignal.h
//信号处理函数
void handle(int n){}unsigned int t_sleeps(unsigned int seconds){alarm(2);//设置一个两秒闹钟pause();//停止进程return alarm(0);//取消原来的脑子返回未决时间}int main(void){//不能忽略SIGALRM信号这样pause会一直起作用不会停止//signal(SIGALRM,SIG_IGN);signal(SIGALRM,handle);while(1){t_sleeps(2);printf(nihao...\n);}return 0;
} #includestdio.h包含了标准输入输出的头文件。#include unistd.h包含了UNIX标准的头文件其中包括了alarm()和pause()函数的声明。#includesignal.h包含了信号处理相关的头文件。void handle(int n){}定义了一个空的信号处理函数handle()用于处理信号。在这个示例中它并没有实际功能。unsigned int t_sleeps(unsigned int seconds)定义了一个自定义的睡眠函数t_sleeps()它接受一个参数seconds表示睡眠的秒数并返回一个unsigned int类型的值表示剩余的未决定时间。alarm(2);调用alarm()函数设置一个两秒的定时器。这会在两秒后向进程发送一个SIGALRM信号。pause();调用pause()函数使进程暂停等待信号的到来。当接收到信号后进程会恢复执行。return alarm(0);取消之前设置的闹钟并返回未决定的时间。 在main()函数中 注册了信号处理函数将SIGALRM信号的处理方式设置为handle函数。这一步通常是为了确保程序在接收到SIGALRM信号时不会终止。使用一个无限循环调用t_sleeps(2)函数表示每隔两秒打印一次nihao...。 这个程序的主要目的是演示如何使用alarm()和pause()函数实现一个自定义的睡眠函数。当调用t_sleeps()函数时程序会暂停执行两秒钟然后继续执行后续的代码。 3.信号阻塞和信号集 3.1信号集的常用操作
#includesignal.h
#includet_stdio.hint main(void){//定义信号集类型变量set__sigset_t set;//初始化setsigemptyset(set);//将2号信号添加到信号集set中sigaddset(set,2);sigaddset(set,3);//测试3号信号是不是信号集中的一员int issigismember(set,3);if(is-1)E_MSG(sigismember,-1);if(is) printf(signum is member of set..\n);else printf(signum is not member of set..\n);//将3号信号从信号集中移除sigdelset(set , 3);issigismember(set,3);if(is-1)E_MSG(sigismember,-1);if(is) printf(del signum is member of set..\n);else printf(del signum is not member of set..\n);return 0;
} 信号的阻塞 3.2进程的信号掩码集 #includet_stdio.h
#include asm-generic/signal-defs.h
#include bits/sigset.hint main(void){//定义信号集的变量set__sigset_t set;//初始化setsigemptyset(set);//将2,3,9号信号添加到信号集set中sigaddset(set,2);sigaddset(set,3);sigaddset(set,9);//将set设置为进程的信号掩码集int smsigprocmask(SIG_SETMASK,set,NULL);if(sm-1)E_MSG(sigprocmask,-1);while(1){}return 0;
} __sigset_t set;定义了一个变量 set类型为 __sigset_t这是一个用于表示信号集的数据结构。sigemptyset(set);使用 sigemptyset() 函数将信号集 set 清空确保其中不包含任何信号。sigaddset(set,2);、sigaddset(set,3); 和 sigaddset(set,9);使用 sigaddset() 函数向信号集 set 中添加信号。在这里将信号2、3和9添加到 set 中分别代表 SIGINT、SIGQUIT 和 SIGKILL 信号。int smsigprocmask(SIG_SETMASK,set,NULL);使用 sigprocmask() 函数将 set 中的信号设置为进程的信号掩码集。SIG_SETMASK 表示设置当前信号掩码为 set 中包含的信号集合即阻塞信号2、3和9。如果设置成功sigprocmask() 返回0否则返回-1并且相应的错误信息会被设置到 errno 中。while(1){}进入一个无限循环使得程序一直处于运行状态以保持信号掩码的设置。 3.3未决信号集
#includet_stdio.h
#includesignal.h
#include asm-generic/signal-defs.h
#includeunistd.hint main(void){//定义信号集类型变量__sigset_t set , pset;//初始化信号集sigemptyset(set);//添加信号到setsigaddset(set,2);//将set设置为进程的信号掩码集int sm sigprocmask(SIG_BLOCK,set,NULL);if(sm-1)E_MSG(sigismember,-1);while(1){sleep(1);//获取进程的未决信号集,pset存放的就是进程的未决信号集sigpending(pset);int issigismember(pset,2);if(is-1)E_MSG(sigismemeber,-1);is? printf(yes..\n) : printf(no..\n);}return 0;
} 信号掩码集signal mask 信号掩码集是用于阻塞一组信号的也就是说被加入到该进程的信号掩码集中的信号都会被阻塞直到被从掩码集中移除。在你的代码中通过sigprocmask(SIG_BLOCK,set,NULL);将2号信号(SIGINT即CtrlC触发的中断信号)加入到了掩码集中从而阻塞了该信号。未决信号集pending signal 未决信号集是指当前被阻塞并且尚未处理的信号集合。只要这个信号在掩码集中那么该信号一旦产生就会被追加到未决信号集中等待处理。在代码中未决信号集的状态被周期性检查并且每秒输出一次结果显示2号信号是否存在于未决信号集中。 应用场景 信号掩码集主要用于在处理某个信号时临时屏蔽其它会对当前处理过程产生干扰的信号比如在处理某些复杂的业务逻辑或者关键数据更新时防止被其它信号打断。 未决信号集则帮助我们得知哪些信号被阻塞且尚未得到处理这对于调试程序以及编写稳健的并发处理代码很有帮助。