为什么某些系统在strace

当我跟踪此代码时


void printMsg();

int main() {
  signal(SIGPROF,printMsg);

  struct itimerval tick;
  memset(&tick,sizeof(tick));

  tick.it_value.tv_sec = 1;  // sec
  tick.it_value.tv_usec = 0; // micro sec.
  tick.it_interval.tv_sec = 0;
  tick.it_interval.tv_usec = 0;

  setitimer(ITIMER_PROF,&tick,NULL);

  while(1) {
    ;
  }

  return 0;
}

void printMsg() {
    printf("%s","Hello World!!\n");
}

1秒后我收到了SIGPROF信号

...
05:54:10 setitimer(ITIMER_PROF,{it_interval={0,0},it_value={1,0}},NULL) = 0
05:54:11 --- SIGPROF {si_signo=SIGPROF,si_code=SI_KERNEL} ---
...

但是,当我在write(2,"",0)中添加诸如read(2,0)while(1)的系统调用并再次跟踪时,似乎无法触发SIGPROF。但是,time(0)中的while(1)可以正确触发SIGPROF。

顺便说一句,我使用此代码模拟以下PHP脚本,该脚本忽略了PHP-FPM SAPI下的时间限制,

<?php
set_time_limit(5);  // PHP uses setitimer(ITIMER_PROF) to implement this function
while (true) {
    flush();       // PHP uses write(<fd>,0) to implement this function
}

addsion 回答:为什么某些系统在strace

代码使用ITIMER_PROF触发SIGPROF,它在进程执行时或系统代表进程运行时进行计数。

当进程进入“读”或“写”调用时,它不是“正在运行”。该进程进入IO等待状态(系统会将CPU分配给其他进程)。当该进程处于IOWait中时,计时器不会移动。如果有执行处理的系统调用(通常在系统空间中),例如time()是一个紧密的循环,计时器将移动。

https://www.tecmint.com/linux-process-management/中查看有关过程状态的更多信息

如果要测量“时钟”时间,请考虑使用带有CLOCK_REALTIME或CLOCK_MONOTONIC的timer_create

本文链接:https://www.f2er.com/3168798.html

大家都在问