UNIX-LINUXプログラミング実践チュートリアル->第5章->インスタンスコード注記->setecho.c

2541 ワード

一つの問題
エコービットの状態を設定し、コマンドラインパラメータがyの場合はオン、そうでない場合はオフにします.
にぶんせき
標準入力ファイル記述子は0である.tcgetattr()関数とtermios構造体を使用して、標準入力のプロパティを取得します.tcsetattr()関数とtermios構造体を使用して、変更したプロパティ設定を標準入力に書き換えることができます.
三実現
#include <stdio.h>
#include <termios.h>

#define oops(s,x) {perror(s);exit(x)};

main(int ac,char *av[])
{
    struct termios info;
    /*      */
    if(ac == 1)
    {
        exit(0);
    }
    /*      */
    if(tcgetattr(0,&info) == -1)
    {
        oops("tcgettattr",1);
    }
    /*               y,     ,    */
    if(av[1][0] == 'y')
    {
        info.c_lflag |= ECHO;
    }
    else
    {
        info.c_lflag &= ~ECHO;
    }
    /*           */
    if(tcsetattr(0,TCSANOW,&info) == 1)
    {
        oops("tcsetattr",2);
    }
}

四相関関数及び構造体
1 tcgetattr()関数ttyドライバのプロパティヘッダファイル:#include  #include 関数プロトタイプ:int tcgetattr(int fd,struct termios*info)パラメータ:fd端末に関連付けられたファイル記述子info端末構造へのポインタ戻り値:-1エラー0で正常に戻りました
2 tcsetattr()関数ttyドライバのプロパティヘッダファイル:#include  #include 関数プロトタイプ:int tcsetattr(int fd,int when,struct termios*info);パラメータ:fdが端末に関連付けられたファイル記述子whenが設定を変更する時間(TCSANOW即時;TCSADRAINドライバ待ちキュー内の全ての出力が端末TCSAFLUSHドライバ待ちキュー内の全ての出力に転送され、全てのキュー内の入力データが解放される)infoターミナル構造へのポインタ戻り値:-1エラーに遭遇しました0正常に戻りました
3 termios構造体struct termios{tcflag_t c_iflag;/*input mode flags*/tcflag_t c_oflag;/*output mode flags*/tcflag_t c_cflag;/*control mode flags*/tcflag_t c_lflag;/*local mode flags*/cc_t c_c[NC CS];  /*control characters*/  speed_t c_ispeed;  /*input speed*/  speed_t c_ospeed;  /*output speed*/}