问题标签 [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.

0 投票
1 回答
147 浏览

c - 代码不使用多个信号处理程序

我有这段代码,我想用它来处理不同的信号。我不知道为什么它永远不会进入 timer_handler2()。它只是停留在 timer_handler() 上。有人可以告诉我我做错了什么

0 投票
1 回答
395 浏览

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,会显示什么副作用?

0 投票
1 回答
326 浏览

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 )后才会杀死程序。

任何帮助/解释将不胜感激!

谢谢大家,

前任

0 投票
0 回答
825 浏览

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 结构(其中有几个)或未能在某处设置一些位。

0 投票
2 回答
1567 浏览

c - c setitimer 在其调用范围之外不发送信号

我有以下情况

我想要的是每 2 秒 foo 将被调用(foo 实际上除了 while(1) 还做了一些其他的事情,假设 foo run 需要超过 2 秒),在 2 秒后 foo 确实被调用了,但是没有其他调用是直到 foo 返回。我尝试使用信号掩码(因此是 sigfillset),但也尝试在简单调用时signal(SIGVTALRM, foo)对结果进行任何更改。我还尝试在 main 外部声明 itimerval 和 sigactions 变量,但它并没有完全影响任何事情。

我正在尝试做的事情甚至可能吗?

谢谢!

0 投票
1 回答
80 浏览

linux - 在linux中对发送到CPU的两个信号做出反应

我写了以下代码:

}

int ut_start(void) {

}

我的目的是编写一个同时响应 SIGVTALRM 信号和 SIGALRM 的程序。但是,当我运行该程序时,该程序似乎只对 SIGALRM 信号作出反应。

在函数 ut_start() 中,我启动了一个每 100 微秒重置一次的计时器。我没有看到任何证据表明它有效。

还有一件事,如何调试这个程序以便我可以真正看到计时器已经启动?在调试模式下是否有任何变量可以告诉我有关计时器状态的信息?

0 投票
2 回答
798 浏览

c - 运行计时器 30 秒

我想每秒触发一个计时器,持续 30 秒。但是,定时器只触发一次,程序停止。如何让计时器运行 30 秒?

0 投票
3 回答
5164 浏览

c - C语言中getitimer和setitimer的使用

我正在编写以下 C 代码来获取使用 getitimer 和 setitimer 执行简单操作所需的时间。

我已经编译了:

但是,我的答案始终是 999999(我已经提高和降低了 100):

我的错误是什么?另外,我想问一下使用这样的程序可以获得的最高精度是多少?

非常感谢!

0 投票
2 回答
440 浏览

c - 防止 SIGALRM 中断 waitpid()

我正在尝试waitpid()为子进程制作我的进程,但也要每隔一段时间打印一些东西。

我目前的计划是安排一个itimer,,waitpid()处理SIGALRM打印,并在完成时停止计时器waitpid()

我无法弄清楚的唯一部分是SIGALRM防止waitpid().

我查看了手册页并没有看到任何标志。

想法?

0 投票
0 回答
62 浏览

c - 如何在进程的cpu时间和实时时间上设置两个计时器?

我尝试使用setitimer(ITIMER_PROF, &tick, NULL)来限制进程消耗的 cpu 时间。但是如果进程变为挂起(在我的情况下,进程陷入死循环,然后 Ubuntu16.04 将其挂起并且不再唤醒它),计时器无法终止进程。

如果我使用:

限制更大的实时。手册页说后者setitimer将覆盖前者。

如何setitimer在 CPU 时间和实时时间上限制进程时间?