1. 程式人生 > >termios結構體詳解

termios結構體詳解

termios 結構是在POSIX規範中定義的標準介面,它類似於系統V中的termio介面,通過設定termios型別的資料結構中的值和使用一小組函式呼叫,你就可以對終端介面進行控制。

可以被調整來影響終端的值按照不同的模式被分為如下幾組:

1.輸入模式

2.輸出模式

3.控制模式

4.本地模式

5.特殊控制模式

termios結構型別包括若干個標誌集和一個控制字元的陣列,所有的Unix版本包含以下結構體:

struct termios

{

tcflag_tc_iflag;             //輸入模式標誌tcflag_tc_oflag;            //輸出模式標誌tcflag_tc_cflag;            //控制模式標誌

tcflag_tc_lflag;            //本地模式標誌cc_t    c_cc[NCCS];     //控制字元

speed_tc_isspeed;      //輸入波特率

speed_tc_ospedd;      //輸出波特率

}

1c_iflag:輸入模式標誌,控制終端輸入方式,具體引數如下所示。

IGNBRK

忽略BREAK鍵輸入

BRKINT

如果設定了IGNBRKBREAK鍵的輸入將被忽略,如果設定了BRKINT ,將產生SIGINT中斷

IGNPAR

忽略奇偶校驗錯誤

PARMRK

標識奇偶校驗錯誤

INPCK

允許輸入奇偶校驗

ISTRIP

去除字元的第8個位元

INLCR

將輸入的NL(換行)轉換成CR(回車)

IGNCR

忽略輸入的回車

ICRNL

將輸入的回車轉化成換行(如果IGNCR未設定的情況下)

IUCLC

將輸入的大寫字元轉換成小寫字元(非POSIX

IXON

允許輸入時對XON/XOFF流進行控制

IXANY

輸入任何字元將重啟停止的輸出

IXOFF

允許輸入時對XON/XOFF流進行控制

IMAXBEL

當輸入佇列滿的時候開始響鈴,Linux在使用該引數而是認為該引數總是已經設定

2c_oflag:輸出模式標誌,控制終端輸出方式

,具體引數如下所示。

OPOST

處理後輸出

OLCUC

將輸入的小寫字元轉換成大寫字元(非POSIX

ONLCR

將輸入的NL(換行)轉換成CR(回車)及NL(換行)

OCRNL

將輸入的CR(回車)轉換成NL(換行)

ONOCR

第一行不輸出回車符

ONLRET

不輸出回車符

OFILL

傳送填充字元以延遲終端輸出

OFDEL

ASCII碼的DEL作為填充字元,如果未設定該引數,填充字元將是NUL‘\0’)(非POSIX

NLDLY

換行輸出延時,可以取NL0(不延遲)或NL1(延遲0.1s

CRDLY

回車延遲,取值範圍為:CR0CR1CR2 CR3

TABDLY

水平製表符輸出延遲,取值範圍為:TAB0TAB1TAB2TAB3

BSDLY

空格輸出延遲,可以取BS0BS1

VTDLY

垂直製表符輸出延遲,可以取VT0VT1

FFDLY

換頁延遲,可以取FF0FF1

3c_lflag:本地模式標誌,控制終端編輯功能,具體引數如下所示。

ISIG

當輸入INTRQUITSUSPDSUSP時,產生相應的訊號

ICANON

使用標準輸入模式

XCASE

ICANONXCASE同時設定的情況下,終端只使用大寫。如果只設置了XCASE,則輸入字元將被轉換為小寫字元,除非字元使用了轉義字元(非POSIX,且Linux不支援該引數)

ECHO

顯示輸入字元

ECHOE

如果ICANON同時設定,ERASE將刪除輸入的字元,WERASE將刪除輸入的單詞

ECHOK

如果ICANON同時設定,KILL將刪除當前行

ECHONL

如果ICANON同時設定,即使ECHO沒有設定依然顯示換行符

ECHOPRT

如果ECHOICANON同時設定,將刪除打印出的字元(非POSIX

TOSTOP

向後臺輸出傳送SIGTTOU訊號

4c_cflag:控制模式標誌,指定終端硬體控制資訊,具體引數如下所示。

CBAUD

波特率(4+1位)(非POSIX

CBAUDEX

附加波特率(1位)(非POSIX

CSIZE

字元長度,取值範圍為CS5CS6CS7CS8

CSTOPB

設定兩個停止位

CREAD

使用接收器

PARENB

使用奇偶校驗

PARODD

對輸入使用奇偶校驗,對輸出使用偶校驗

HUPCL

關閉裝置時掛起

CLOCAL

忽略調變解調器線路狀態

CRTSCTS

使用RTS/CTS流控制

5c_cc[NCCS]:控制字元,用於儲存終端驅動程式中的特殊字元,如輸入結束符等。

只有在本地模式標誌c_lflag中設定了IEXITEN時,POSIX沒有定義的控制字元才能在Linux中使用。每個控制字元都對應一個按鍵組合(^C^H等),但VMINVTIME這兩個控制字元除外,它們不對應控制符。這兩個控制字元只在原始模式下才有效。

巨集

c_cc[VINTR]

預設對應的控制符是^C,作用是清空輸入和輸出佇列的資料並且向tty裝置的前臺程序組中的每一個程式傳送一個SIGINT訊號,對SIGINT號沒有定義處理程式的程序會馬上退出。

c_cc[VQUIT]

預設對應的控制符是^/,作用是清空輸入和輸出佇列的資料並向tty裝置的前臺程序組中的每一個程式傳送一個SIGQUIT訊號,對SIGQUIT 訊號沒有定義處理程式的程序會馬上退出。

c_cc[verase]

預設對應的控制符是^H^?,作用是在標準模式下,刪除本行前一個字元,該字元在原始模式下沒有作用。

c_cc[VKILL]

預設對應的控制符是^U,在標準模式下,刪除整行字元,該字元在原始模式下沒有作用。

c_cc[VEOF]

預設對應的控制符是^D,在標準模式下,使用read()返回0,標誌一個檔案結束。

c_cc[VSTOP]

預設對應的控制字元是^S,作用是使用tty裝置暫停輸出直到接收到VSTART控制字元。或者,如果裝置了IXANY,則等收到任何字元就開始輸出。

c_cc[VSTART]

預設對應的控制字元是^Q,作用是重新開始被暫停的tty裝置的輸出。

c_cc[VSUSP]

預設對應的控制字元是^Z,使當前的前臺程序接收到一個SIGTSTP訊號。

c_cc[VEOL]c_cc[VEOL2]

在標準模式下,這兩個下標在行的末尾加上一個換行符('/n'),標誌一個行的結束,從而使用緩衝區中的資料被髮送,並開始新的一行。POSIX沒有定義VEOL2

c_cc[VREPRINT]

預設對應的控制符是^R,在標準模式下,如果設定了本地模式標誌ECHO,使用VERPRINT對應的控制符和換行符在本地顯示,並且重新列印當前緩衝區中的字元。POSIX中沒有定義VERPRINT

c_cc[VWERASE]

預設對應的控制字元是^W,在標準模式下,刪除緩衝區末端的所有空格符,然後刪除與之相鄰的非空格符,從而起到在一行中刪除前一個單詞的效果。 POSIX中沒有定義VWERASE

c_cc[VLNEXT]

預設對應的控制符是^V,作用是讓下一個字元原封不動地進入緩衝區。如果要讓^V字元進入緩衝區,需要按兩下^VPOSIX中沒有定義 VLNEXT

與結構體相關的函式

(1)   tcgetattr()

原型:int tcgetattr(int fd,structtermois & termios_p);

功能:取得終端介質(fd)初始值,並把其值賦給temios_p;函式可以從後臺程序中呼叫;但是,終端屬性可能被後來的前臺程序所改變。

2tcsetattr()

原型:inttcsetattr(int fd,int actions,const struct    termios*termios_p);

功能:設定與終端相關的引數 (除非需要底層支援卻無法滿足),使用termios_p 引用的termios 結構。optional_actionstcsetattr函式的第二個引數)指定了什麼時候改變會起作用:
TCSANOW
:改變立即發生
TCSADRAIN:改變在所有寫入fd 的輸出都被傳輸後生效。這個函式應當用於修改影響輸出的引數時使用。(當前輸出完成時將值改變)  
TCSAFLUSH :改變在所有寫入fd 引用的物件的輸出都被傳輸後生效,所有已接受但未讀入的輸入都在改變發生前丟棄(TCSADRAIN,但會捨棄當前所有值)

3tcsendbreak()傳送連續的0 值位元流,持續一段時間,如果終端使用非同步序列資料傳輸的話。如果duration 0,它至少傳輸 0.25 秒,不會超過 0.5 秒。如果 duration非零,它傳送的時間長度由實現定義。如果終端並非使用非同步序列資料傳輸,tcsendbreak()什麼都不做。4tcdrain()等待直到所有寫入fd 引用的物件的輸出都被傳輸。5tcflush()丟棄要寫入引用的物件,但是尚未傳輸的資料,或者收到但是尚未讀取的資料,取決於queue_selector 的值:

TCIFLUSH:重新整理收到的資料但是不讀
TCOFLUSH :重新整理寫入的資料但是不傳送
TCIOFLUSH :同時重新整理收到的資料但是不讀,並且重新整理寫入的資料但是不傳送

6tcflow()掛起 fd 引用的物件上的資料傳輸或接收,取決於action 的值:

TCOOFF:掛起輸出
TCOON :重新開始被掛起的輸出
TCIOFF :傳送一個STOP 字元,停止終端裝置向系統傳送資料
TCION :傳送一個START 字元,使終端裝置向系統傳輸資料
開啟一個終端裝置時的預設設定是輸入和輸出都沒有掛起。
(7)
波特率函式被用來獲取和設定termios 結構中,輸入和輸出波特率的值。新值不會馬上生效,直到成功呼叫了tcsetattr() 函式。設定速度為 B0 使得 modem"掛機"。與 B38400 相應的實際位元率可以用setserial(8) 調整。輸入和輸出波特率被保存於 termios 結構中。
cfmakeraw
設定終端屬性如下:
           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;

cfgetospeed()返回termios_p 指向的termios 結構中儲存的輸出波特率

cfsetospeed()設定termios_p 指向的termios 結構中儲存的輸出波特率為speed。取值必須是以下常量之一:
B0       B50       B75       B110       B134        B150       B200       B300       B600       B1200       B1800       B2400       B4800       B9600       B19200        B38400       B57600       B115200        B230400
其中:零值 B0 用來中斷連線。如果指定了 B0,不應當再假定存在連線。通常,這樣將斷開連線。CBAUDEX是一個掩碼,指示高於POSIX.1 定義的速度的那一些(57600 及以上)。因此,B57600& CBAUDEX 為非零。

cfgetispeed()返回 termios 結構中儲存的輸入波特率。

cfsetispeed()設定 termios 結構中儲存的輸入波特率為 speed。如果輸入波特率被設為0,實際輸入波特率將等於輸出波特率。

RETURNVALUE 返回值
cfgetispeed()
返回termios 結構中儲存的輸入波特率。

cfgetospeed()返回 termios 結構中儲存的輸出波特率。其他函式返回:0(成功)或-1(失敗),並且為 errno 置值來指示錯誤。注意:tcsetattr()返回成功,如果任何所要求的修改可以實現的話。因此,當進行多重修改時,應當在這個函式之後再次呼叫tcgetattr() 來檢測是否所有修改都成功實現

例項:

1.關閉終端回顯,鍵盤輸入的字元不會在終端視窗顯示:

#include <stdio.h>

#include <stdlib.h>

#include <termios.h>

#include <unistd.h>

int main(void)

{

struct termios ts,ots;

char passbuf[1024];

tcgetattr(STDIN_FILENO,&ts); // STDIN_FILENO的值是1,表示標準輸入的檔案描述符

ots = ts;

ts.c_lflag &= ~ECHO; /* 關閉回終端回顯功能*/

ts.c_lflag |= ECHONL;

tcsetattr(STDIN_FILENO,TCSAFLUSH,&ts); /* 應用新終端設定 */

fgets(passbuf,1024,stdin); /* 輸入字元不會在終端顯示 */

printf("you input character = %s/n",passbuf);

tcsetattr(STDIN_FILENO,TCSANOW,&ots); /* 恢復舊的終端裝置 */

}

2.讀取每一個字元

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <termios.h>

char *menu[] = {

"a - add new record",

"d - delete record",

"q - quit",

NULL,

};

int getchoice(char *greet, char *choices[], FILE *in, FILE *out);

int main()

{

int choice = 0;

FILE *input;

FILE *output;

struct termios initial_settings,new_settings;

if (!isatty(fileno(stdout))) {

fprintf(stderr,"You arenot a terminal, OK.\n");

}

input =fopen("/dev/tty", "r");

output = fopen("/dev/tty","w");

if(!input || !output) {

fprintf(stderr, "Unableto open /dev/tty\n");

exit(1);

}

tcgetattr(fileno(input),&initial_settings);

new_settings = initial_settings;

new_settings.c_lflag &=~ICANON;

new_settings.c_lflag &=~ECHO;

new_settings.c_cc[VMIN] = 1;

new_settings.c_cc[VTIME] = 0;

new_settings.c_lflag &=~ISIG;

if(tcsetattr(fileno(input),TCSANOW, &new_settings) != 0) {

fprintf(stderr,"couldnot set attributes\n");

}

do {

choice =getchoice("Please select an action", menu, input, output);

printf("You havechosen: %c\n", choice);

} while (choice != 'q');

tcsetattr(fileno(input),TCSANOW,&initial_settings);

exit(0);

}

int getchoice(char *greet, char *choices[], FILE *in, FILE *out)

{

int chosen = 0;

int selected;

char **option;

do {

fprintf(out, "Choice:%s\n",greet);

option = choices;

while(*option) {

fprintf(out,"%s\n",*option);

option++;

}

do {

selected = fgetc(in);

} while (selected == '\n' ||selected == '\r');

option = choices;

while(*option) {

if(selected ==*option[0]) {

chosen = 1;

               break;

}

option++;

}

if(!chosen) {

fprintf(out,"Incorrect choice, select again\n");

}

} while(!chosen);

return selected;

}

相關推薦

termios結構

termios 結構是在POSIX規範中定義的標準介面,它類似於系統V中的termio介面,通過設定termios型別的資料結構中的值和使用一小組函式呼叫,你就可以對終端介面進行控制。 可以被調整來影

struct termios結構【轉】

一、資料成員 termios 函式族提供了一個常規的終端介面,用於控制非同步通訊埠。 這個結構包含了至少下列成員: tcflag_t c_iflag;      /* 輸入模式 */ tcflag_t c_oflag;      /* 輸出模式 */ tcflag_t

struct termios結構

VINTR:(003, ETX, Ctrl-C, or also 0177, DEL, rubout) 中斷字元。發出 SIGINT 訊號。當設定 ISIG 時可被識別,不再作為輸入傳遞。   VQUIT :(034, FS, Ctrl-) 退出字元。發出 SIGQUIT 訊號。當設定 ISIG 時可被識別,

結構

個數 初始化 例子 傳遞 其中 == 整形 註意 執行 1 概述  C語言允許用戶自己指定這樣一種數據結構,它由不同類型的數據組合成一個整體,以便引用,這些組合在一個整體中的數據是互相聯系的,這樣的數據結構稱為結構體,它相當於其它高級語言中記錄。  聲明一個結構休類型的一般

Linux進程描述符task_struct結構--Linux進程的管理與調度(一)【轉】

mage ase 設備 兩種 等價 而且 當前 結構體 技術 Linux內核通過一個被稱為進程描述符的task_struct結構體來管理進程,這個結構體包含了一個進程所需的所有信息。它定義在include/linux/sched.h文件中。 談到task_struct結構體

C語言的結構(轉載只是為了查閱方便,若有侵權立刪)

C語言的結構體詳解 結構體(struct) 1、定義   一般格式為:          struct 結構名          {    

tty驅動之tty_operations結構

struct tty_operations { struct tty_struct * (*lookup)(struct tty_driver *driver, struct inode *inode, int idx); //返回

C/C++結構

前面沒有typedef的,}後面的都是結構體變數,結構體變數陣列,結構體指標變數,都是變數。 有typedef的,}後面的都是型別,是可以拿來構建變數的。 typedef struct FreAarea//定義一個空閒區說明表結構 { long size; //分割槽大小 l

文章17 ngx_http_request_t結構

struct ngx_http_request_s {     uint32_t                          signature;         /* "HTTP" */ /* 與連線有關的內容 */     ngx_connection

struct net_device網路裝置結構

在linux中使用struct net_device結構體來描述每一個網路裝置。同時這個用來刻畫網路裝置的struct net_device結構體包含的欄位非常的多,以至於核心的開發者都覺得在現在的linux核心中,這個struct net_device是一個大

C語言結構

結構(struct)      結構是由基本資料型別構成的、並用一個識別符號來命名的各種變數的組合。  結構中可以使用不同的資料型別。      1. 結構說明和結構變數定義      在Turbo C中, 結構也是一種資料型別, 可以使用結構變數, 因此, 

linux中file_operations結構

/** * author:hasen * 參考:《linux裝置驅動開發詳解》和sunsea1026的CSDN部落格 * 作用:方便自己參考查閱 */ struct file_operations{ struct module *owner //第一個 file

FATFS裡的FILINFO結構

當呼叫FatFS中的f_readdir函式返回FILINFO值的時候,大家如果直接看FILINFO裡面的值可能看不懂。因為裡面的值需要大家轉換一下,FILINFO的具體格式如下:/* File information structure (FILINFO) */ typed

sizeof與offsetof有關的結構

sizeof與offsetof在程式中經常遇到,但在面試中其應用使得許多小夥伴吃閉門羹,被面試官問得啞口無言。接下來對兩者的應用做詳細介紹。 關於sizeof 定義 sizeof乃C/C++中的一個操作符(operator), 簡單的說其作用就是返

Linux下DIR,dirent,stat等結構

最近在看Linux下檔案操作相關章節,遇到了這麼幾個結構體,被搞的暈乎乎的,今日有空,仔細研究了一下,受益匪淺。 首先說說DIR這一結構體,以下為DIR結構體的定義: struct __dirstream       {    void *__fd; 

MySql表結構修改

參數 詳解 增加 not des reat fault sign charset 修改表的語法=========================增加列[add 列名]=========================①alter table 表名 add 列名 列類型 列參

HTML5新增的結構元素

ade 我們 分享圖片 web頁面 .com section 還要 cti img H5添加了那些新的結構元素 標簽 說明 header 頁面或頁面中某一個區塊的頁眉,通常是一些引導和導航信息。 nav 可以作為頁面導航的鏈接

Redis rdb資料結構 原始碼

記錄下來以後方便回憶,需要時隨時翻閱 一、Redis  RDB檔案的資料結構  二、Redis  RDB檔案的十六進位制碼和對應的字元   三、Redis  save和bgsave命令處理過程  

termios結構的詳細設定

termios結構體內容: 成員 描述 ------------------------------------------- c_cflag 控制模式標誌 c_lflag 本地模式標誌 c_iflag 輸入模式標誌 c_oflag 輸出模式標誌 c_line line discipline c_

termios結構的詳細設定【轉】

termios結構體內容: 成員 描述 ------------------------------------------- c_cflag 控制模式標誌 c_lflag 本地模式標誌 c_iflag 輸入模式標誌 c_oflag 輸出模式標誌 c_line line