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