对终端进行读写和与终端对话例程

  1 /*
  2 对终端进行读写的程序
  3 */
  4
  5 #include <stdio.h>
  6 #include <unistd.h>
  7
  8 char *menu[] =
  9 {
 10     "a - add new record",
 11     "d - delete record",
 12     "q - quit",
 13     NULL,
 14 };//定义了字符串数组
 15
 16 int getchoice(char *greet, char *choices[]);//定义了函数原型
 17
 18 int main()//主函数
 19 {
 20     int choice = 0;
 21
 22     if(!isatty(fileno(stdout)))//是终端的话返回1,不指执行循环体
 23     {
 24         fprintf(stderr,"You are not a terminal!\n");
 25         exit(1);
 26     }
 27
 28     do
 29     {
 30         choice = getchoice("Please select an action", menu);//调用函数
 31         printf("You have chosen: %c\n", choice);//打印选择的字符串
 32     } while (choice != ‘q‘);
 33     exit(0);
 34 }
 35
 36 int getchoice(char *greet, char *choices[])//核心函数
 37 {
 38     int chosen = 0;
 39     int selected;
 40     char **option;
 41
 42     do
 43     {//先无条件循环一次
 44         printf("Choice: %s\n",greet);//打印欢迎语
 45
 46         option = choices;//数组赋值给option
 47         while(*option)
 48         {//option不为空
 49             printf("%s\n",*option);//循环打印option
 50             option++;
 51         }
 52
 53         //selected = getchar();//获取用户输入单独这句在ubuntu上好像不能截取处合适的字符
 54         do{selected=getchar();}
 55         while (selected == ‘\n‘);
 56
 57         option = choices;//再次给option赋值为数组
 58         while(*option)
 59         {//不为空的时候
 60             if(selected == *option[0]) //对比数组第一个字母和选择的输入
 61             {
 62                 chosen = 1;//
 63                 break;
 64             }
 65             option++;
 66         }
 67         if(!chosen) {//有匹配的话不执行
 68             printf("Incorrect choice, select again\n");
 69         }
 70     } while(!chosen);//有匹配的话不再循环
 71     return selected;
 72 }
 73 //执行效果:
 74 /*
 75 [email protected]:~/c_program/544977-blp3e/chapter05$ ./a.out
 76 Choice: Please select an action
 77 a - add new record
 78 d - delete record
 79 q - quit
 80
 81
 82
 83 a
 84 You have chosen: a
 85 Choice: Please select an action
 86 a - add new record
 87 d - delete record
 88 q - quit
 89 d
 90 You have chosen: d
 91 Choice: Please select an action
 92 a - add new record
 93 d - delete record
 94 q - quit
 95 q
 96 You have chosen: q
 97 [email protected]:~/c_program/544977-blp3e/chapter05$
 98
 99 [email protected]:~/c_program/544977-blp3e/chapter05$ ./a.out >file
100 You are not a terminal!
101
102 */
 1 #include <stdio.h>
 2 #include <unistd.h>
 3
 4 char *menu[] = {
 5     "a - add new record",
 6     "d - delete record",
 7     "q - quit",
 8     NULL,
 9 };//定义了字符数组
10
11 int getchoice(char *greet, char *choices[], FILE *in, FILE *out);//定义了函数原形
12
13 int main()//主函数
14 {
15     int choice = 0;
16     FILE * input;
17     FILE * output;
18
19     if (!isatty(fileno(stdout))) {//是终端的话返回-1执行循环体
20         fprintf(stderr,"You are not a terminal, OK.\n");
21     }
22
23     input = fopen("/dev/tty", "r");//只读模式打开终端。返回文件流
24     output = fopen("/dev/tty", "w");//指写模式打开终端,返回文件流
25     if(!input || !output) { //出错处理
26         fprintf(stderr,"Unable to open /dev/tty\n");
27         exit(1);
28     }
29
30     do {
31         choice = getchoice("Please select an action", menu, input, output);
32         printf("You have chosen: %c\n", choice);//调用函数,打印这句话
33     } while (choice != ‘q‘);
34     exit(0);
35 }
36
37 int getchoice(char *greet, char *choices[], FILE *in, FILE *out)//核心函数
38 {
39     int chosen = 0;
40     int selected;
41     char **option;
42
43     do {
44         fprintf(out,"Choice: %s\n",greet);
45         option = choices;
46         while(*option)
47         {
48             fprintf(out,"%s\n",*option);
49             option++;//打印数组内容
50         }
51
52         do
53         {
54             selected = fgetc(in);//从输入流获取输入到selected中
55         } while (selected == ‘\n‘);
56
57         option = choices;
58         while(*option)
59          {//当数组不为空的时候
60             if(selected == *option[0]) //匹配第一个字符和输入
61             {
62                 chosen = 1;
63                 break;
64             }
65             option++;
66         }
67         if(!chosen)
68         {
69             fprintf(out,"Incorrect choice, select again\n");
70         }
71     } while(!chosen);
72     return selected;//返回匹配的输入
73 }
74
75 //执行效果
76 /*
77 [email protected]:~/c_program/544977-blp3e/chapter05$ ./a.out >file1
78 You are not a terminal, OK.
79 Choice: Please select an action
80 a - add new record
81 d - delete record
82 q - quit
83 a
84 Choice: Please select an action
85 a - add new record
86 d - delete record
87 q - quit
88 q
89 [email protected]:~/c_program/544977-blp3e/chapter05$ cat file1
90 You have chosen: a
91 You have chosen: q
92
93 */

关于怎么重定向到文件中的还是没看懂。应该是跟/dev/tty的性质有关系吧,以后学到再研究。

参考文献:

Linux程序设计 Neil Matthew

时间: 2024-10-28 14:56:33

对终端进行读写和与终端对话例程的相关文章

【嵌入式linux】(第三步):安装串口终端 (ubuntu安装minicom串口终端)

1.前言 我使用的是USB转串口,芯片是PL2303,貌似ubuntu自带了PL2303的USB驱动,可以直接使用,其它的USB转串口的没试过. 2.minicom安装 在终端中输入 : sudo apt-get install minicom 按提示下载并安装minicom, 下载安装完成后使用命令启动minicom,在终端中输入:sudo minicom 即可启动minicom. 3.minicom设置 关闭已经打开的minicom,在终端中输入sudo minicom -s 即可对mini

在一个终端踢掉另一个终端的用户

踢出系统中的用户 思路: 1.自己是root用户,或者有相应的权限(虽然普通用户也可以执行此命令,但是并不会将用户踢出) 2.查看系统中登陆的用户有哪些,并且确定用户在哪些终端 3.踢出该用户 4.查看剩余的用户 方法一: fuser -k 杀死进程访问的指定文件 方法二: pkill -t      只匹配终端 pkill -kill -t pts/2

代码中创建新终端 以及的把新终端的输出打印到文件,用于调式。

转自:http://blog.chinaunix.net/uid-20682147-id-4981769.html cat term.c #include<stdio.h> #include<stdbool.h> #include<stdlib.h> #include<string.h> #include<sys/prctl.h> #include<unistd.h> #include<utmp.h> #include&l

(PHP)程序中如何判断当前用户终端是手机等移动终端

推荐: Mobile-Detect:https://github.com/serbanghita/Mobile-Detect/blob/master/Mobile_Detect.php Detect Mobile Browser:http://detectmobilebrowsers.com/ 其他方法(具体效果有待实践): /** * * 根据php的$_SERVER['HTTP_USER_AGENT'] 中各种浏览器访问时所包含各个浏览器特定的字符串来判断是属于PC还是移动端 * @auth

免费提供大量单片机读写U盘的通讯例程

累积十二年工业现场运行; 单片机读写U盘的专家免费为用户提供: STC.PIC,ATMEL等各种品牌单片机读写U盘例程及详细说明. 希望这些技术方案资料能给您的工作带来一些帮助. 索取资料方式: ①加QQ876963800 ②跟帖留邮箱 ③加微信订阅号:DTD110HF 要哪个送那个!

【LINUX】 会话 进程组 作业 终端

[进程组]  进程组是一个或多个进程的集合.每个进程除了有一个进程ID之外,还属于一个进程组.  每个进程组有一个唯一的进程组ID.每个进程组都可以有一个组长进程. 组长进程的进程组ID等于其进程ID.进程组是否存在和有无组长无关. 每个进程都是属于进程组的,没有独立的进程,除非该进程组中只有一个进程,则可以说这个进程是独立的. 组长进程可以创建一个进程组,创建该组中的进程,然后终止. 但是只要有一个进程存在,则这个进程组就存在,这与其组长进程是否终止无关. 通常,它们与同一作业相关联,可以接收

Linux 程序设计学习笔记----终端及串口编程基础之概念详解

转载请注明出处,谢谢! linux下的终端及串口的相关概念有: tty,控制台,虚拟终端,串口,console(控制台终端)详解 部分内容整理于网络. 终端/控制台 终端和控制台都不是个人电脑的概念,而是多人共用的小型中型大型计算机上的概念. 1.终端 一台主机,连很多终端,终端为主机提供了人机接口,每个人都通过终端使用主机的资源. 终端有字符哑终端和图形终端两种. 控制台是另一种人机接口, 不通过终端与主机相连, 而是通过显示卡-显示器和键盘接口分别与主机相连, 这是人控制主机的第一人机接口.

RFID标签、读卡器、终端、接口的概念

RFID标签:(引用)RFID无线射频识别是一种非接触式的自动识别技术,它通过射频信号自动识别目标对象并获取相关数据,识别工作无须人工干预,可工作于各种恶劣环境.RFID技术可识别高速运动物体并可同时识别多个电子标签, 操作快捷方便. 读卡器:RFID射频标签读写设备是射频识别系统的两个重要组成部分(标签与读写器)之一.射频标签读写设备根据具体实现功能的特点也有一些其他较为流行的别称,如:阅读器(Reader),查询器(Interrogator),通信器(Communicator),扫描器(Sc

作业、终端、守护进程

作业: 一个或多个进程的集合,一个前台作业可以由多个进程组成,一个后台作业也可由多个进程组成.Shell真正控制的不是进程而是作业,Shell只能运行一个前台作业和任意多个后台作业,这为作业控制. 进程组: 每个进程都属于一个进程组,每个组都有唯一的进程组ID,每个进程组都有一个组长进程.只要某进程组的一个进程存在,该进程组就存在,与组长进程是否终止无关. 会话: 一个或多个进程组的集合,包括一个控制进程(会话首进程).一个前台进程组和任意多个后台进程组. 终端: 用户通过终端登录系统后得到一个