如果想知道標準輸出是否被重新導向了,只需要檢查底層的檔案描述符是否關聯到了一個終端即可。系統調用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;}