我正在学习编程的重入性。在IBM 的这个站点上(非常好)。我已经建立了一个代码,复制在下面。这是第一个在网站上滚动的代码。
该代码尝试通过打印在“危险上下文”中不断变化的两个值来显示涉及在文本程序的非线性开发(异步性)中共享访问变量的问题。
#include <signal.h>
#include <stdio.h>
struct two_int { int a, b; } data;
void signal_handler(int signum){
printf ("%d, %d\n", data.a, data.b);
alarm (1);
}
int main (void){
static struct two_int zeros = { 0, 0 }, ones = { 1, 1 };
signal (SIGALRM, signal_handler);
data = zeros;
alarm (1);
while (1){
data = zeros;
data = ones;
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试运行代码时出现问题(或者更好,没有出现)。我在默认配置中使用 gcc 版本 6.3.0 20170516 (Debian 6.3.0-18+deb9u1)。不会发生被误导的输出。获得“错误”对值的频率为 0!
到底发生了什么?为什么使用静态全局变量重入没有问题?
这个问题问完之后,一个疑问就来了:
一旦fopen()比open()更快(至少对于顺序写入/就绪操作),前者是一个库,后者是一个系统调用,那么fopen()在 POSIX 兼容操作系统中执行什么系统调用?