为什么 regexec()、regcomp() 和后面的 print 语句不立即执行?

Why don't regexec(), regcomp(), followed by print statements execute immediately?

我有一个用 C 编码的正常运行的 HTTP 服务器。在我向它添加正则表达式功能的过程中,我遇到了我的程序的奇怪功能。 我的主要功能如下所示:

int main(void)

{
    char *example = "index.html";
    regex_t REGEXhtml;
    int mond = 1;
    if(regcomp(&REGEXhtml, ".html", 0)){printf("REGEX error 1"); return -1;}
    mond = regexec(&REGEXhtml, example, 0, NULL, 0);
    if(!mond) {printf("FOUND HTML");}
    printf("%i", mond);

    //......server code ........
}

出于某种原因,编译后执行此代码时,打印语句将 NEVER 打印出来,我的程序似乎会无限空闲。如果没有上述代码,这是预期的行为,因为我的服务器将在终端空闲并等待连接,然后将其记录到终端。 出乎意料的是,该程序不仅挂在那里。当有人连接到我的服务器时,将打印 printf 语句,然后是我的服务器记录 printf 语句。

由于这违背了我目前对编程的理解,我稍微研究了一下这个问题,并从man page中找到了以下内容:

│regcomp(), regexec() │ Thread safety │ MT-Safe locale

属性 link 将此描述为含义:

   locale Functions annotated with locale as an MT-Safety issue read
          from the locale object without any form of
          synchronization.  Functions annotated with locale called
          concurrently with locale changes may behave in ways that
          do not correspond to any of the locales active during
          their execution, but an unpredictable mix thereof.

这是否准确地解释了上述行为?我很困惑如何拥有这些功能似乎可以延迟我的打印语句的执行,尤其是最后一个。 如果该描述相关,那么在执行和编译期间究竟发生了什么技术细节?

编辑: 下面的 DannyNiu 修正了我的简单错误,但我仍然对 MT-Safety 语言环境的示例及其对代码其他部分的影响感兴趣。如果有人有示例或 link 解释,请在下方 post/comment

stdout(因此 printf)被完全缓冲,除非 libc 检测到它正在输出到终端 window,在这种情况下它是行缓冲的。

尝试在输出字符串的末尾添加换行符,或添加 fflush 调用。

Edit: So DannyNiu below fixed my simple mistake, but I'm still interested in an example of the MT-Safety locale and its implications on other parts of code. If anyone has examples or links to explanations please post/comment below

语言环境专为程序的文本输入和输出的国际化和本地化而设计。

一个进程有一个与之关联的全局区域设置,这个区域通常应该由主线程设置。对于多线程程序,通常不需要在子线程(非主线程)中更改语言环境,因为大多数时候,程序仅以一种语言与用户交互。

但也有例外,例如加载以其他语言环境编码的文件时。在这种情况下,语言环境对象会看到它们的用途。

例如,不区分大小写的字符串比较函数 strcasecmp(3)strcasecmp_l(3) 依赖于语言环境,但是 strcasecmp_l(3) 可以采用语言环境对象(避免依赖于全局状态),它允许它在与主线程不同的语言环境中进行文本处理。