我有一個用 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 陳述句。
由于這違背了我目前對編程的理解,我對這個問題進行了一些研究,并從手冊頁中找到了以下內容:
│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 語言環境的示例及其對代碼其他部分的影響感興趣。如果有人有示例或解釋的鏈接,請在下面發布/評論
uj5u.com熱心網友回復:
stdout(因此printf)被完全緩沖,除非libc檢測到它正在輸出到終端視窗,在這種情況下它是行緩沖的。
嘗試在輸出字串的末尾添加換行符,或添加fflush呼叫。
uj5u.com熱心網友回復:
編輯:所以下面的 DannyNiu 修復了我的簡單錯誤,但我仍然對 MT-Safety 語言環境的示例及其對代碼其他部分的影響感興趣。如果有人有示例或解釋的鏈接,請在下面發布/評論
Locale 是為程式的文本輸入和輸出的國際化和本地化而設計的。
一個行程有一個與之關聯的全域語言環境,這個本地環境通常應該由主執行緒設定。對于多執行緒程式,通常沒有必要更改子執行緒(非主執行緒)內的語言環境,因為大多數時候,程式僅使用一種語言與用戶互動。
但也有例外,例如加載以其他語言環境編碼的檔案時。在這種情況下,語言環境物件會看到它們的用途。
例如,不區分大小寫的字串比較函式strcasecmp(3)和strcasecmp_l(3)語言環境相關,但strcasecmp_l(3)可以采用語言環境物件(避免依賴全域狀態),這允許它在與主執行緒不同的語言環境中進行文本處理。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/393272.html
下一篇:使用陣列列印素數
