Linux終端輸入輸出 termios 函式

2021-06-09 17:32:41 字數 4683 閱讀 8671

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 用 來改變讀進的資料...