- block buffered:一般檔案採用的方式,以 block 方式 (滿 block?) 寫入。檔案頭次 I/O 操作會 malloc() 取得緩衝區。
- line buffered:一般終端機的輸入 (stdin) 或輸出 (stdout) 採用的方式,遇到換行傳送。
- unbuffered:沒緩衝、馬上輸出。stderr 預設是 unbuffered。
int setvbuf(FILE *stream, char *buf, int mode, size_t size);
mode 是 _IONBF (unbuffered)、_IOLBF (line buffered)、和 _IOFBF (fully buffered,指 block buffer?) 之一。除了 unbuffered,size 大小的 buf 取代原本的緩衝區 (會釋出?)。如果 buf 是 NULL,在下次讀寫操作時自動配置新的緩衝區。setvbuf() 可能只能在 stream 任何其它操作之前使用。
注意:需要確認 stream 關閉時,buffer 是可用的。
void setbuf(FILE *stream, char *buf); 相當於 setvbuf(stream, buf, buf ? _IOFBF : _IONBF, BUFSIZ);
void setbuffer(FILE *stream, char *buf, size_t size); 相當於 setvbuf(stream, buf, buf ? _IOFBF : _IONBF, size);
void setlinebuf(FILE *stream); 相當於 setvbuf(stream, NULL, _IOLBF, 0);
fflush() 強迫輸出。 (見 fclose().)
註:開啟 file stream
#include <stdio.h>
fopen(), fdopen(), freopen
皆會用到 mode,可能是 r、r+、w、w+、a、a+。為了相容,都可以加上 b。
fopen():開啟檔名
fdopen():開啟 file descriptor
freopen():fclose() 再 fopen()?用來改變 stdin、stdout、stderr 使用的 file。
參考
- https://linux.die.net/man/3/setlinebuf
- https://jenyiw.pixnet.net/blog/post/9391777 和 https://jenyiw.pixnet.net/blog/post/9391585:fwrite() 是 library 函數,使用緩衝區減少頻繁呼叫 syscall write(),在多次少量時效率會比直接用 write() 好。但 fwrite() 多了一次緩衝讀寫,在一次多量效率就會比 write() 差。
- 相關函數:fseek()、fgetpos()、open()、fclose()、fileno()、fmemopen()、fopencookie()。
- https://man7.org/linux/man-pages/man3/termios.3.html
- https://blog.xuite.net/uwlib_mud/twblog/108242774
- http://lwn.net/images/pdf/LDD3/ch18.pdf
- termios
- 在 canonical 模式 (正規模式),終端設備會處理特殊字元,一次一行的方式輸入給應用程式。例如 Linux 的 shell指令。非正規模式終端設備不會處理特殊字元,一次一個字元的方式輸入給應用程式。
- tty 名稱來自 teletypewriter 的縮寫,用來表示任何序列埠樣式的裝置,,可能是實體的裝置如 serial
ports、USB-to-serial-port converters、一些需要特殊處理的數據機,或者是虛擬裝置用來登入。
沒有留言:
張貼留言