问题标签 [setitimer]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 代码不使用多个信号处理程序
我有这段代码,我想用它来处理不同的信号。我不知道为什么它永远不会进入 timer_handler2()。它只是停留在 timer_handler() 上。有人可以告诉我我做错了什么
php - 为什么 php 在 setitimer 中使用 ITIMER_PROF 而不是 ITIMER_REAL?
Linux 下的 PHP 通过 setitimer 中的 ITIMER_PROF 实现 ini(max_execution_time) 和 set_time_limit,但不使用 ITIMER_REAL。通过谷歌它,我在 php.net 中找到了一个关于这个问题的线程https://bugs.php.net/bug.php?id=65596。相关 PHP 手册http://php.net/manual/en/function.set-time-limit.php注意
set_time_limit() 函数和配置指令 max_execution_time 只影响脚本本身的执行时间。在确定脚本运行的最长时间时,不包括在脚本执行之外发生的活动所花费的任何时间,例如使用 system() 的系统调用、流操作、数据库查询等。在测量时间是真实的 Windows 上,情况并非如此。PHP 似乎设计为使用 ITIMER_PROF。
我想知道为什么 PHP 超时机制是这样设计的,如果我在 Zend/zend_execute_API.c 中将 ITIMER_PROF 更改为 ITIMER_REAL,会显示什么副作用?
c - 为什么 setitimer 和 dup2 在 execvp 之后为子进程工作?
首先让我说这里有很多问题。
我的论文的一项任务要求我编写一个执行子程序的程序,如果它的运行时间(不是 wall-time 而是 user+sys )大于特定值或者它的 RAM 消耗大于另一个,则将其杀死指定值。
虽然我还没有弄清楚 RAM 部分。我用 setitmer 和 ITIMER_PROF 信号来消磨时间。(因为 ITIMER_PROF 收集实际的 CPU 使用情况,而不是设置一个起始时间点,然后计算 x 时间量)
我使用 setitimer 的原因是因为我需要的精度低于秒精度。(EG 在 1.75 秒(1750000微秒)后终止进程。setrlimit 方法只有一秒。
问题1为什么在父进程中设置了ITIME_PROF的setitimer不起作用?孩子的CPU/系统调用不是由它收集的吗?
问题 2为什么会这样!?execvp 不会覆盖所有函数(timeout_sigprof、main 和任何其他函数)吗?并且不能有人潜在地捕获子程序中的信号并取代原始功能吗?
问题 3为什么放在这里的 dup2 真的可以工作,让孩子的输入/输出被重定向?
这是我编写的代码,它仅在程序运行 X 时间( x = 500ms )后才会杀死程序。
任何帮助/解释将不胜感激!
谢谢大家,
前任
macos - 使用 sigaction 和 setitimer 系统调用在 BSD/OS X 上实现汇编语言计时器
我正在尝试使用 sigaction() 和 setitimer() 系统调用在 OS X Lion 上的 32 位汇编程序中实现计时器例程。这个想法是使用 setitimer() 设置一个计时器,然后让生成的警报信号调用之前通过 sigaction() 设置的处理函数。我有这样的机制在 Linux 上运行,但似乎无法让它在 OS X 上运行。我知道 OS X 和 Linux 之间的系统调用约定不同,并且 OS X 有 16 字节对齐要求。尽管对这些进行了补偿,但我仍然无法使其正常工作(通常是“总线错误:10”错误)。认为我在对齐方面做错了,我编写了一个简单的 C 程序来执行我想要的操作,然后使用 clang 3.2 生成汇编代码。然后我通过替换对 sigaction() & 的调用来修改机器生成的程序集 setitimer() 与适当的系统 & int $0x80 调用,以及堆栈对齐指令。结果程序仍然不起作用。
这是我用来生成程序集的 C 程序 sigaction.c。请注意,我注释掉了 printf 和 sleep 的东西,因此生成的汇编代码更容易阅读:
}
这是在上述文件中使用“clang -arch i386 -S sigaction.c”生成的汇编代码:
如果我使用“clang -arch i386 sigaction.s -o sigaction”编译汇编代码,使用 lldb 调试它并在处理函数中放置一个断点,处理函数确实每秒调用一次。所以我知道汇编代码是正确的(C 代码也是如此)。
现在,如果我将对 sigaction() 的调用替换为:
以及对 setitimer() 的调用:
汇编代码不再起作用,并生成与我的手工编码汇编代码相同的“总线错误:10”。
我尝试删除用于对齐堆栈的 subl/addl 指令以及更改值以确保堆栈在 16 字节边界上对齐,但似乎没有任何效果。我要么得到总线错误、分段错误,要么代码在没有调用处理函数的情况下挂起。
我在调试期间确实注意到的一件事是 sigaction 调用似乎对底层系统调用有一个冗长的包装。如果您从 lldb 中反汇编这两个函数,您会看到 sigaction() 有一个冗长的包装器,但 setitimer 没有。不确定这意味着什么,但也许 sigaction() 包装器在传递数据之前正在处理数据。我尝试调试该代码,但还没有找到任何确定的东西。
如果有人知道如何通过用适当的系统调用替换 sigaction() 和 setitimer() 函数来使上述汇编代码工作,将不胜感激。然后我可以进行这些更改并将它们应用到我的手工编码例程中。
谢谢。
更新:我将我的手写汇编代码剥离到可管理的大小,并且能够使用 sigaction() 和 setitimer() 库调用使其工作,但仍然没有弄清楚为什么系统调用不起作用。这是代码(timer.s):
当使用“clang -arch i386 timer.s -o timer”编译并使用 lldb 调试时,处理程序例程每秒调用一次。我放弃了使代码与代码中的系统调用一起工作的努力——它们在 sigaction() 和 setitimer() 调用周围被注释掉了。如果除了教育自己(和其他人)之外没有其他原因,我仍然希望尽可能让系统调用版本正常工作,如果没有,请了解它不起作用的原因。
再次感谢。
更新 2:我让 setitimer 系统调用正常工作。这是修改后的代码:
但是相同的编辑不适用于 sigaction sys 调用,这使我回到了最初的结论 - sigaction() 库函数在进行实际的 syscall 之前做了一些额外的事情。来自 dtruss 的这个片段似乎暗示了同样的事情:
使用 sigaction() 系统调用(不工作):
使用 sigaction() 库调用(工作):
如您所见,两个版本之间的第二个参数是不同的。使用系统调用时,似乎直接传递了 sigaction 结构的地址(0x2030),但使用库调用时传递了其他东西。我猜“其他东西”是在 sigaction() 库函数中生成的。
更新 3:我发现 FreeBSD 9.1 上存在同样的问题。setitimer 系统调用有效,但 sigaction 系统调用无效。与 OS X 一样,sigaction() 库调用确实有效。
BSD 有一些 sigaction 系统调用 - 到目前为止,我只尝试过我在 OS X 中使用的同一个 - 0x2e。也许其他 sigaction 系统调用之一会起作用。知道 BSD 具有相同的行为将使这更容易追踪,因为我可以提取 C 源代码。此外,这向可能已经知道问题所在的更广泛的人群开放了问题。
基于我对系统调用如何工作的理解以及 sigaction 在 Linux 上工作的事实,我不禁认为我的代码做错了什么。然而,用 sigaction() 库函数替换 int $0x80 调用导致我的代码工作的事实似乎与此相矛盾。FreeBSD 开发人员手册中有一整章是关于汇编语言编程的,还有一节是关于进行系统调用的,所以我正在做的应该是可能的:
https://www.freebsd.org/doc/en_US.ISO8859-1/books/developers-handbook/x86-system-calls.html
除非有人能指出我做错了什么(如果有的话),否则我认为下一步是让我查看 sigaction() 的 BSD 源代码。正如我之前提到的,我查看了 OS X 上 sigaction 的反汇编版本,发现它与其他系统调用相比相当长,并且充满了幻数。希望通过查看 C 代码可以清楚地了解它在做什么才能使其正常工作。最后,它可能很简单,例如传入错误的 sigaction 结构(其中有几个)或未能在某处设置一些位。
c - c setitimer 在其调用范围之外不发送信号
我有以下情况
我想要的是每 2 秒 foo 将被调用(foo 实际上除了 while(1) 还做了一些其他的事情,假设 foo run 需要超过 2 秒),在 2 秒后 foo 确实被调用了,但是没有其他调用是直到 foo 返回。我尝试使用信号掩码(因此是 sigfillset),但也尝试在简单调用时signal(SIGVTALRM, foo)
对结果进行任何更改。我还尝试在 main 外部声明 itimerval 和 sigactions 变量,但它并没有完全影响任何事情。
我正在尝试做的事情甚至可能吗?
谢谢!
linux - 在linux中对发送到CPU的两个信号做出反应
我写了以下代码:
}
int ut_start(void) {
}
我的目的是编写一个同时响应 SIGVTALRM 信号和 SIGALRM 的程序。但是,当我运行该程序时,该程序似乎只对 SIGALRM 信号作出反应。
在函数 ut_start() 中,我启动了一个每 100 微秒重置一次的计时器。我没有看到任何证据表明它有效。
还有一件事,如何调试这个程序以便我可以真正看到计时器已经启动?在调试模式下是否有任何变量可以告诉我有关计时器状态的信息?
c - 运行计时器 30 秒
我想每秒触发一个计时器,持续 30 秒。但是,定时器只触发一次,程序停止。如何让计时器运行 30 秒?
c - C语言中getitimer和setitimer的使用
我正在编写以下 C 代码来获取使用 getitimer 和 setitimer 执行简单操作所需的时间。
我已经编译了:
但是,我的答案始终是 999999(我已经提高和降低了 100):
我的错误是什么?另外,我想问一下使用这样的程序可以获得的最高精度是多少?
非常感谢!
c - 防止 SIGALRM 中断 waitpid()
我正在尝试waitpid()
为子进程制作我的进程,但也要每隔一段时间打印一些东西。
我目前的计划是安排一个itimer
,,waitpid()
处理SIGALRM
打印,并在完成时停止计时器waitpid()
。
我无法弄清楚的唯一部分是SIGALRM
防止waitpid()
.
我查看了手册页并没有看到任何标志。
想法?
c - 如何在进程的cpu时间和实时时间上设置两个计时器?
我尝试使用setitimer(ITIMER_PROF, &tick, NULL)
来限制进程消耗的 cpu 时间。但是如果进程变为挂起(在我的情况下,进程陷入死循环,然后 Ubuntu16.04 将其挂起并且不再唤醒它),计时器无法终止进程。
如果我使用:
限制更大的实时。手册页说后者setitimer
将覆盖前者。
如何setitimer
在 CPU 时间和实时时间上限制进程时间?