linux c编程疑问之2-----关于/dev/tty和标准输入读入

jialejiahi 2010-10-23 04:50:52
代码如下:
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdio.h>
#include<unistd.h>
#define DUMMY 0
#define BUFSIZE 1024

char *validID[] = {"123\n", "5678\n", "007\n", "421\n", "F"};

int main(int argc, char *argv[])
{
int fd,flags;
int n;
char userno[BUFSIZE], **ptr;
ptr = validID;
setbuf(stdout, (char *) NULL);
if((fd = open("/dev/tty", O_RDONLY | O_NDELAY)) == -1)
{
printf("open error");
return 1;
}
printf("Please input your ID: \n");
sleep(3);
if(read(0, userno, BUFSIZE) == 0)
// if(read(fd, userno, BUFSIZE) == 0)
{
printf("Bye Bye!\n");
return 2;
}
while((strcmp(*ptr, userno) != 0) && (strcmp(*ptr, "F") != 0))
++ptr;
if(strcmp(*ptr, "F") == 0)
{
puts("Invalid user ID\n");
return 3;
}
flags = fcntl(fd, F_SETFL, flags);
printf("Enter your department Number: \n");
n = read(0, userno, BUFSIZE);
printf("\n Welcome to Department #");
write(1, userno, n);
close(fd);
return 0;
}
问题如下:
1 if((fd = open("/dev/tty", O_RDONLY | O_NDELAY)) == -1)这一句我的机器上返回的fd值是7,这代表的是标准输入(键盘)吗?
2 为什么if(read(0, userno, BUFSIZE) == 0)和if(read(fd, userno, BUFSIZE) == 0)两句都不能达到我想要的效果,程序的运行结果总是“Invalid user ID,然后退出“,有什么办法可以以完成以从键盘输入(以从标准输入读取文件的方式)
谢谢大家指点帮忙!
...全文
515 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2010-10-25
  • 打赏
  • 举报
回复
标准输入用fgets和scanf这两个函数应该足够了。最多在加上rewind(stdin);
justkk 2010-10-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jialejiahi 的回复:]
可是还是没有解决问题啊,gdb看到userno中的内容,前面的字符是想要的,但是后面没有在适当的位置插入‘\0’。还有我一直想知道的是/dev/tty代表的是什么设备或者说文件啊?
[/Quote]
read是不会自动添加\0的,试试fgets(STDIN, ..)
/dev/tty就是你的控制终端

你可以对同一个文件打开多次,返回的描述符可能是5、6、7,那这3个描述符都是引用同一个文件,等价的
jialejiahi 2010-10-25
  • 打赏
  • 举报
回复
高手帮忙啊!
bo_00 2010-10-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jialejiahi 的回复:]

谢谢帮忙!
2楼,是正常的,可是标准输入设备对应的文件描述符不是0吗?
3楼,这一句有什么问题?用标准输入设备的描述符直接作为参数不对吗?求解释...
[/Quote]

系统最初默认:
FILE * stdin 标准输入 对应的 文件描述符是 宏STDIN_FILENO(0)
FILE * stdout 标准输出 对应的 文件描述符是 宏STDOUT_FILENO(1)
FILE * stderr 标准error 对应的 文件描述符是 宏STDERR_FILENO(2)

用freopen()可以改变FILE * stdout(or stdin or stderr )的指向。 但其fd文件描述符,总是 0,1,2。


read(0, userno, BUFSIZE);
就是从fd(0),读取BUFSIZE这么长数据,存到userno中。0 就是 宏STDIN_FILENO(表示标准输入),至于你把标准输入FILE * stdin指向到哪里了,就是你自己控制得了。如果把FILE * stdin指向到文件aaa,那么就是从aaa文件中读取。

jialejiahi 2010-10-24
  • 打赏
  • 举报
回复
感谢四楼!
可是还是没有解决问题啊,gdb看到userno中的内容,前面的字符是想要的,但是后面没有在适当的位置插入‘\0’。还有我一直想知道的是/dev/tty代表的是什么设备或者说文件啊?
jialejiahi 2010-10-23
  • 打赏
  • 举报
回复
谢谢帮忙!
2楼,是正常的,可是标准输入设备对应的文件描述符不是0吗?
3楼,这一句有什么问题?用标准输入设备的描述符直接作为参数不对吗?求解释...
ogiso_pest 2010-10-23
  • 打赏
  • 举报
回复
ssize_t read(int fieldes, void *buf, size_t nbytes);
//返回值:若成功则返回读到的字节数,若已到文件结尾则返回0,若出错则返回-1

if(read(0, userno, BUFSIZE) > 0)

呵呵~
pengxn 2010-10-23
  • 打赏
  • 举报
回复
1 if((fd = open("/dev/tty", O_RDONLY | O_NDELAY)) == -1)这一句我的机器上返回的fd值是7,这代表的是标准输入(键盘)吗?

-----------
按你开辟的句柄数目算的,可以认为是第7个打开的,不是-1都是正常的


69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧