【发布时间】:2022-01-25 01:03:17
【问题描述】:
我有一个用 C 编码的功能正常的 HTTP 服务器。在向它添加正则表达式功能的过程中,我遇到了我的程序的奇怪功能。 我的主要功能如下所示:
int main(void)
{
char *example = "index.html";
regex_t REGEXhtml;
int mond = 1;
if(regcomp(®EXhtml, ".html", 0)){printf("REGEX error 1"); return -1;}
mond = regexec(®EXhtml, example, 0, NULL, 0);
if(!mond) {printf("FOUND HTML");}
printf("%i", mond);
//......server code ........
}
由于某种原因,在编译后执行此代码时,打印语句将从不打印出来,我的程序似乎会无限空闲。这是没有上述代码的预期行为,因为我的服务器将在终端中空闲并等待连接,然后将其记录到终端。 出乎意料的是,该程序不只是挂在那里。当有人连接到我的服务器时,printf 语句会按应有的方式打印出来,然后是我的服务器记录 printf 语句。
由于这与我目前对编程的理解背道而驰,因此我对这个问题进行了一些研究,并从man page 中发现了以下内容:
│regcomp(), regexec() │ 线程安全 │ MT-Safe locale
属性链接将其描述为含义:
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 语言环境的示例及其对代码其他部分的影响感兴趣。如果有人有示例或解释链接,请在下面发布/评论
【问题讨论】:
标签: c regex printf posix flush