我怎么知道sig_atomic_t是否改变了值?

时间:2012-05-29 03:14:48

标签: c unix signals signal-processing

因为我需要在SIGCHLD到达时更新作业状态,我怎么知道sig_atomic_t是否改变了值? 代码看起来像这样......

sig_atomic_t child_status;
sig_atomic_t child_pid;  //is this ok?             
void sigHandler(int signum){
      pid_t pid;
      int status;
      while((pid = wait(-1, &status, WNOHANG) > 0){
              child_status = status;
              child_pid = (int)pid;
      }
}

1 个答案:

答案 0 :(得分:1)

您不知道sig_atomic_t有多大,因此您无法在其中存储pid或状态。也就是说,C标准简单地说:

  

§7.14信号处理

     

...

     

定义的类型是

sig_atomic_t
     

是可以被访问的对象的(可能是volatile限定的)整数类型   原子实体,即使存在异步中断也是如此。

POSIX不保证任何额外的AFAICS。总而言之,在n位机器上,sig_atomic_t是一个n位类型(但是具有半宽总线的芯片,如8088,可能会受到更多限制)。

通过将变量中的当前值与您认为上次使用的值进行比较,判断它是否与其他变量的更改方式相同:

int old_status = child_status;
int old_pid    = child_pid;

...busy code...

if (child_status != old_status || child_pid != old_pid)
    ...something changed...
相关问题