簡體   English   中英

fgets 在 Windows 上從 bash 運行時導致 C 程序掛起,但在從 CMD 或 WSL 運行時正常工作

[英]fgets causes C program to hang when run from bash on Windows, but works correctly when run from CMD or WSL

我正在學習“構建你自己的 Lisp”教程來自學 C,並且遇到了一些與 fgets 相關的奇怪行為。 這是我正在研究的章節的鏈接: http : //www.buildyourownlisp.com/chapter4_interactive_prompt#an_interactive_prompt

該代碼是最終將成為 REPL 的簡單基礎。 它只是打印一些信息,然后啟動一個循環來獲取和打印用戶輸入。

#include <stdio.h>

static char input[2048];

int main(int argc, char** argv) {
        puts("Brenlisp Version 0.0.0.0.1");
        puts("Press Ctrl+c to Exit\n");

        while (1) {
                fputs("brenlisp> ", stdout);
                fgets(input, 2048, stdin);
                fputs(input, stdout);
        }

        return 0;
}

當我從 Bash 終端(Windows 10)運行可執行文件時,程序啟動但沒有向控制台打印任何內容,也沒有接受/打印用戶輸入。

bschw@DESKTOP-92VUB1F MINGW64 ~/Projects/brenlisp
$ ./prompt.exe

但是,當我從 CMD 運行可執行文件時,提示按預期執行:

C:\Users\bschw\Projects\brenlisp>prompt.exe
BrenLisp Version 0.0.0.0.1
Press Ctrl+c to Exit

brenlisp> works fine
works fine
brenlisp> works fine
brenlisp> ^C
C:\Users\bschw\Projects\brenlisp>

另一個奇怪的事情是,當我在 WSL 上運行程序時,它在退出之前不會將“^C”字符串打印到控制台:

bschw@DESKTOP-92VUB1F:/mnt/c/Users/bschw/Projects/brenlisp$ ./prompt.exe
BrenLisp Version 0.0.0.0.1
Press Ctrl+c to Exit

brenlisp> works
works
brenlisp> works
brenlisp> bschw@DESKTOP-92VUB1F:/mnt/c/Users/bschw/Projects/brenlisp$

為什么這些程序的行為取決於它們從哪個 shell 運行? 我怎樣才能讓程序在 Bash 上正常工作?

在許多實現中,C 標准庫在內部緩沖區 (*) 中緩沖輸出。

通常,對於文本流,它執行“行緩沖”(處理'\\n'后緩沖區被清空)。 這似乎是你的情況。 您的輸出 des 不包含換行符。

要強制清空緩沖區,請使用fflush()進行輸出操作。

printf("not a line");
fflush(stdout);             // force buffer emptying

printf("complete line\n");  // line-buffering poses no issue here

(*) 輸入流也可以被緩沖,但是輸入緩沖的管理是完全不同的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM