我想了解信号处理程序是如何工作的。我看到了一个关于极客健忘的例子:
int val = 10;
void handler(int sig){
val += 5;
}
int main(){
pid_t pid;
signal(SIGCHLD, handler);
if((pid = fork()) == 0){
val -= 3;
exit(0);
}
waitpid(pid, NULL, 0);
printf("val = %d\n", val);
exit(0);
}我对为什么输出值为15感到困惑。最初,我猜测这是因为子进程在不同的地址中有变量val。但是,当我试图在子进程和其父进程中打印val的地址时,它们都显示相同的内存地址。
发布于 2020-11-16 13:00:35
您打印的地址是虚拟地址,它是进程内存空间中全局变量的地址。子进程和父进程的内存空间看起来是一样的,但它们实际上不是相同的内存空间(这意味着它们不占用相同的物理内存)。
这是一个很高的水平(有点不准确)的答案,我建议您阅读有关虚拟内存,以正确理解这一点。
https://stackoverflow.com/questions/64857554
复制相似问题