LINUX終端編程

來源:互聯網
上載者:User

如果想知道標準輸出是否被重新導向了,只需要檢查底層的檔案描述符是否關聯到了一個終端即可。系統調用isatty就是用來完成這個任務的。

你只需要將有效檔案描述符傳遞給它,它就能判斷是否串連到了一個終端。

#include <unistd.h>#include <stdio.h>#include <stdlib.h>char *menu[] = {    "a - add new record",    "d - delete record",    "q - quit",    NULL,};int getchoice(char *greet, char *choices[]);int main(){    int choice = 0;    if(!isatty(fileno(stdout))) {        fprintf(stderr,"You are not a terminal!\n");        exit(1);    }    do    {        choice = getchoice("Please select an action", menu);        printf("You have chosen: %c\n", choice);    } while (choice != 'q');    exit(0);}int getchoice(char *greet, char *choices[]){    int chosen = 0;    int selected;    char **option;    do {        printf("Choice: %s\n",greet);        option = choices;        while(*option) {            printf("%s\n",*option);            option++;        }        selected = getchar();        option = choices;        while(*option) {            if(selected == *option[0]) {                chosen = 1;                break;            }            option++;        }        if(!chosen) {            printf("Incorrect choice, select again\n");        }    } while(!chosen);     return selected;}

./menu2 >file

You are not a terminal!

LINUX提供了一個特殊的裝置/dev/tty來解決對終端的讀寫問題,這個裝置始終指向當前終端或當前登入的會話,由於linux把一切事物都當作

檔案來看,所以,我們可以像操作一般的檔案來操作對/dev/tty的讀寫。

#include <stdio.h>#include <unistd.h>#include <stdlib.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;    if (!isatty(fileno(stdout))) {        fprintf(stderr,"You are not a terminal, OK.\n");    }    input = fopen("/dev/tty", "r");    output = fopen("/dev/tty", "w");    if(!input || !output) {         fprintf(stderr,"Unable to open /dev/tty\n");        exit(1);    }    do {        choice = getchoice("Please select an action", menu, input, output);        printf("You have chosen: %c\n", choice);    } while (choice != 'q');    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');        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;}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.