0

因为我需要在 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;
      }
}
4

1 回答 1

1

您不知道 asig_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...
于 2012-05-29T03:40:38.403 回答