如果想知道标准输出是否被重定向了,只需要检查底层的文件描述符是否关联到了一个终端即可。系统调用isatty就是用来完成这个任务的。 你只需要将有效的文件描述符传递给它,它就能判断是否连接到了一个终端。 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; }重定向标准输出到文件,此时stdout不是终端,所以输出如下:
gcc putty.c ./a.out >file You are not a terminal,OK.
正常执行如下:
./a.out You have chosen: a Choice: Please select an action a - add new record d - delete record q - quit d You have chosen: d Choice: Please select an action a - add new record d - delete record q - quit c Incorrect choice, select again Choice: Please select an action a - add new record d - delete record q - quit
新闻热点
疑难解答