2020年10月17日 星期六

line buffer

stream 有 3 種緩衝方式 -- unbuffered、block buffered、和 line buffered:
  • 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。

參考

  1. https://linux.die.net/man/3/setlinebuf
  2. https://jenyiw.pixnet.net/blog/post/9391777https://jenyiw.pixnet.net/blog/post/9391585:fwrite() 是 library 函數,使用緩衝區減少頻繁呼叫 syscall write(),在多次少量時效率會比直接用 write() 好。但 fwrite() 多了一次緩衝讀寫,在一次多量效率就會比 write() 差。
  3. 相關函數:fseek()、fgetpos()、open()、fclose()、fileno()、fmemopen()、fopencookie()。
  4. https://man7.org/linux/man-pages/man3/termios.3.html
  5. https://blog.xuite.net/uwlib_mud/twblog/108242774
  6. http://lwn.net/images/pdf/LDD3/ch18.pdf
  7. termios
  8. 在 canonical 模式 (正規模式),終端設備會處理特殊字元,一次一行的方式輸入給應用程式。例如 Linux 的 shell指令。非正規模式終端設備不會處理特殊字元,一次一個字元的方式輸入給應用程式。
  9. tty 名稱來自 teletypewriter 的縮寫,用來表示任何序列埠樣式的裝置,,可能是實體的裝置如 serial ports、USB-to-serial-port converters、一些需要特殊處理的數據機,或者是虛擬裝置用來登入。

沒有留言:

張貼留言

SIP header Via

所有 SIP 訊息 都要有 Via,縮寫 v。一開始的 UAC 和後續途經的每個 proxy 都會疊加一個 Via 放傳送的位址,依序作為回應的路徑。 格式 sent-protocol sent-by [ ;branch= branch ][ ; 參數 ...] s...