termios系列函式-tcgetattr, tcsetattr, tcsendbreak, tcdrain, tcflush, tcflow, cfmakeraw, cfgetospeed, cfgetispeed, cfsetispeed, cfsetospeed, cfsetspeed等,用以獲取/設定終端裝置的屬性/控制/速度。
1. 函式宣告
函式宣告
#include #include /*獲取檔案描述符fd對應裝置狀態置入termios_p所指向結構體中*/int tcgetattr(int fd, struct termios *termios_p);
/*設定檔案描述符對應裝置狀態*/
int tcsetattr(int fd, int optional_actions, const struct termios *termios_p);
/*向fd傳送0位元*/
int tcsendbreak(int fd, int duration);
/*掛起直到所有寫入fd的輸出全部傳送完畢*/
int tcdrain(int fd);
/*丟棄所有準備寫入但還未傳送給fd的資料或從fd已接收但還還未被讀取的資料*/
/*丟棄物件取決於queue_selector*/
int tcflush(int fd, int queue_selector);
/*掛起fd傳送操作或接收操作,掛起物件取決於action*/
int tcflow(int fd, int action);
/*裝置終端屬性*/
void cfmakeraw(struct termios *termios_p);
/*返回termios_p所指向結構體中的輸入波特率*/
speed_t cfgetispeed(const struct termios *termios_p);
/*返回termios_p所指向結構體中的輸出波特率*/
speed_t cfgetospeed(const struct termios *termios_p);
/*設定termios_p所指向結構體中的輸入波特率*/
int cfsetispeed(struct termios *termios_p, speed_t speed);
/*設定termios_p所指向結構體中的輸出波特率*/
int cfsetospeed(struct termios *termios_p, speed_t speed);
/*4.4bsd擴充套件,設定輸入輸出波特率*/
int cfsetspeed(struct termios *termios_p, speed_t speed);
glibc功能測試巨集定義:
cfsetspeed(), cfmakeraw(): _bsd_source
2. termios結構體
大多數termios函式都會用到termios結構。termios結構體定義如下:
typedef unsigned char cc_t;typedef unsigned int speed_t;
typedef unsigned int tcflag_t;
struct termios
;
c_iflag標誌常量
c_oflag標誌常量定義(posix.1):
c_cflag標誌常量:
c_lflag標誌常量:
c_cc陣列定義了一些特殊控制字元:
3. 獲取/更改終端設定
tcgetattr(),tcsetattr()分別用於獲取/更改終端設定
4. canonical和non-canonical模式
c_lflag欄位中的icanon標誌決定終端是否工作在canonical模式。預設情況下,終端為canonical模式
canonical模式
non-canonical模式下,無需使用者輸入行定界符,輸入立即可讀取。
c_cc[vtime]和c_cc[vmin]對read操作的影響:
5. raw模式
cfmakeraw()設定終端工作在"raw"模式下:輸入以字元方式提供,禁止回顯,所有特殊字元被禁止。
raw模式下,終端屬性如下:
termios_p->c_iflag &= ~(ignbrk | brkint | parmrk | istrip
| inlcr | igncr | icrnl | ixon);
termios_p->c_oflag &= ~opost;
termios_p->c_lflag &= ~(echo | echonl | icanon | isig | iexten);
termios_p->c_cflag &= ~(csize | parenb);
termios_p->c_cflag |= cs8;
termios_p->c_iflag &= ~(ignbrk | brkint | parmrk | istrip| inlcr | igncr | icrnl | ixon);
termios_p->c_oflag &= ~opost;
termios_p->c_lflag &= ~(echo | echonl | icanon | isig | iexten);
termios_p->c_cflag &= ~(csize | parenb);
termios_p->c_cflag |= cs8;
6. 線控
控制與終端的連線
tcflow() 掛起fd的傳送或接收操作。掛起物件取決於action:
7. 線速
控制輸入/輸出波特率
設定波特率為b0會使數據機掛起(hang up)。b38400對應的實際速率可能會受到setserial(8)的影響。
8. 返回值
標識函式呼叫結果
9. 例
獲取標準輸入終端(stdin)的屬性並更改標準輸入終端為raw模式(也可以使用更簡便的呼叫-cfmakeraw()完成),接收鍵盤輸入、顯示鍵值,直到接收到ctrl-b輸入。
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
#include
#include
#include
#include
#include
#include
#define buf_length 255
int main(void)
;
int i = 0;
struct termios newtmios=;
struct termios oldtmios=;
ret = tcgetattr(stdin_fileno, &oldtmios);
if ( ret )
memcpy(&newtmios, &oldtmios, sizeof(struct termios));
newtmios.c_iflag &= ~(ignbrk | brkint | parmrk | istrip
| inlcr | igncr | icrnl | ixon);
newtmios.c_oflag &= ~opost;
newtmios.c_lflag &= ~(echo | echonl | icanon | isig | iexten);
newtmios.c_cflag &= ~(csize | parenb);
newtmios.c_cflag |= cs8;
ret = tcsetattr(stdin_fileno, tcsanow, &newtmios);
if ( ret )
printf("press any key(ctrl-b to quit) :\n ");
tcdrain(stdin_fileno);
while ( 1 )
}
}
ret = tcsetattr(stdin_fileno, tcsanow, &oldtmios);
return ret;
}
node 終端輸入輸出
1 let readline require readline 2 初始化程序物件 let rl readline.createinte ce 3 rl.question事件接收鍵盤輸入 rl.question 螢幕顯示內容 function res輸入內容 4 關閉question事件 rl.cl...
linux 輸入輸出
標準輸入 或0 標準輸入重定向,箭頭方向就是資料流向,或0 追加輸入重定向,箭頭方向就是資料流向,標準輸出 或1 標準輸出重定向,箭頭方向就是資料流向,把左邊的資料流向到右邊,會清空右邊之前的資料。或1 追加輸出重定向,箭頭方向就是資料流向,清空前備份 錯誤輸出 2 標準錯誤輸出重定向,箭頭方向就是...
linux輸入輸出重定向
基本概念 這是理解後面的知識的前提,請務必理解 a i o重定向通常與 fd有關,shell的fd通常為10個,即 0 9 b 常用fd有3個,為0 stdin,標準輸入 1 stdout,標準輸出 2 stderr,標準錯誤輸出 預設與keyboard monitor有關 c 用 來改變讀進的資料...