- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
#include<stdio.h>
#include<setjmp.h>
#include<signal.h>
jmp_buf env;
void alarmHandler()
{
printf("\n in alarm Handle");
longjmp(env,1);
}
int main()
{
signal(SIGALRM,alarmHandler);
alarm(2);
for(;;)
{
printf("\nhello");
sleep(1);
if(setjmp(env))
{
printf("\n inside if");
signal(SIGALRM,alarmHandler);
alarm(2);
}
}
return 0;
}
开始时,主动监测信号,然后主动报警 2 秒(倒计时)。在 for
循环中,每次都会保存 setjmp(env)
直到时间结束 setjmp(env)
将使用 longjmp()
。由于 setjmp()
如果从 longjmp()
调用默认返回 0,则第二个 arg 值是该值返回值。
最佳答案
longjmp
函数不被认为是调用信号处理程序的安全函数。
通过这样的跳转,您实际上永远不会离开信号处理程序,进程的上下文仍将是信号处理程序的上下文。那么当我们还没有离开第一个信号处理程序时,如何调用另一个信号处理程序呢?这就是为什么你不应该做你所做的事情。
而是在信号处理程序中设置一个标志,然后在循环中轮询该标志。然后从信号处理程序正常返回,让进程正常进行。
关于c - 为什么 SIGALRM 第二次不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38842951/
我正在尝试编写一个基准测试来接收来自内核的信号,告诉它调整其参数。我正在尝试研究主动或被动方法是否最有效。 在主动方法中,我使用 setitimer 定期设置警报并强制基准测试查看其目前的性能并重新调
我有一个我自己似乎无法解决的问题。我正在编写一个小的 python 脚本,我想知道为什么我的 signal.alarm 在它所在的函数返回后仍然有效。这是代码: class AlarmExceptio
achul@achul:~/chennai/linux/SM_practise$ cat doubt.c #include #include main() { int ret; pri
我们正在尝试使用 sigaction 和 setitimer 从我们的三个函数中的 while(1) 循环中获取控制权,我们现在面临的问题是仅生成一次 SIGALRM,而下一次它不会生成,即我们能够从
我是信号的新手,我正在尝试在 UDP 回显服务上设置 SIGALRM,作为套接字编程实践。 所以这里我有一个 UDP 套接字,客户端向服务器发送一个字符串并等待响应(任何响应,这里的字符串由服务器回显
我是一个非常初级的程序员,我正在 Ubuntu 中开发客户端服务器程序。这段代码属于我的服务器文件,我想实现一个信号SIGALRM,但我不知道如何才能正确地做到这一点。我的目标是:在我调用信号 ala
我在做作业。 作业是在 Linux 系统(在 Ubuntu 上)上制作虚拟实时操作系统。 我的问题是 SIGALRM,它是调度程序的处理程序。 void scheduler(int signo) {
我是 Linux 信号的新手。如果一个进程初始化多个定时器,那么进程如何知道哪个 SIGALRM 属于哪个定时器? 最佳答案 这取决于您如何设置 SIGALRM 处理程序。 考虑不使用 alarm 而
这段代码有问题.. 我需要等待 (sigwait) 一个过程,直到到达两个信号 SIGUSR1/SIGUSR2 (也许我可以使用 sigalrm 捕捉信号?) #include #include
我需要在超时后中断系统调用(在本例中为 recvfrom)。为此,我正在使用 alarm(),但是生成的 SIGALRM 会终止我的进程,而不仅仅是中断系统调用。 我已经尝试调用 signal(SIG
我在使用 SIGALRM 时遇到了问题。我用它每 3 秒写一次事件进程的 pids。但是一旦它杀死主进程,它就会触发。我做错了什么?一段时间后,我还使用信号杀死每个子进程,我在那里使用 SIGTERM
因此,我尝试调用警报以每秒显示一条消息“仍在工作......”。我包含了 signal.h。 在我的 main 之外,我有我的功能:(我从不为 int 声明/定义 s) void display_me
我编写了这段代码,我必须使用警报信号 (SIGALRM) 让程序打印消息“我还活着”。每 3 秒一次。 但它不起作用,只有当我按下 CTR-C 时它才会发送消息“我还活着”,我猜我没有把 SIGALR
在处理类的系统调用时,我遇到了以下代码的麻烦。无论出于何种原因,当信号处理程序中的 print 语句末尾有换行符时,它会按预期运行,接收和处理信号并显示消息。但是,当换行符不存在时,根本不会显示任何输
我有一个问题。我需要实现一个使用计时器和 SIGALRM 切换 ucontext 线程的程序,但是当我使用 evict_thread 函数切换线程时出现段错误。我相信这是竞争条件的结果,因为它发生在程
所以基本上我的程序中有 4-5 个函数。这是很多行代码,需要从文件中读取和写入,并且可能会以无限循环结束(更糟糕的情况),如果超过 20 秒,我想终止我的程序。下面的代码不起作用,我的程序挂起,操作系
嗨,我正在尝试了解有关信号的更多信息,我编写了一个简单的代码,该代码应该只打印“再见”发送警报信号的所有内容。我正在使用 sigaction 来设置它。但是,我在错误检查中不断返回 NULL,有人可以
我目前正在使用 select() 作为计时器。我有一个循环内发生的网络接收操作,每隔几秒需要发生一个处理操作。 因此,select() 语句的超时不断变化——随时间减少到零,然后从 3 重新开始。 r
好吧,不太确定这是内存损坏还是只是我的代码中的错误,但这是问题的描述:单线程程序注册一个SIGALRM处理程序: struct sigaction action; sigset_t blocked;
我有一个 C 程序,如果 n 作为参数传递,它会计算前 n 个素数。 $ ./prime 5 2 3 5 7 11 如果我可以给程序的进程SIGALRM,程序的逻辑允许我进入一个想要的函数。 所以基本
我是一名优秀的程序员,十分优秀!