① linux bash 怎么在read输入字符后,按不按ENTER键,在一定时间后都能自动执行
read 加 -t 选项,设置超时时间(以秒为单位)。比如:
read-p"Select(y/n):"-t5n
5秒超时后会继续往下自动执行。
注意:
只有按ENTER键,才会将用户输入赋值给变量n。
若超时,无论用户是否输入字符,n的值都为空。
② mini2440+linux串口 read()问题
你的问题描述的不太清楚,如果没有数据的话,根据你的设置,程序会一直堵塞到有串口数据可读,buf[res]=0 这条语句其实也很危险,加入res = 255,那就越界了。
③ scoket 在linux下C语言怎么设置read超时
给你一段我写的client代码
C/C++ code
/*客户端*/ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/socket.h> #include<sys/types.h> #include<netdb.h> #include<netinet/in.h> #include<unistd.h> #include<sys/time.h> #include <errno.h> #define SERVERPORT 5556 int main(int argc,char *argv[]) { int sockfd,connectfd=0,recvfd,sendfd ; struct sockaddr_in serv_addr; struct hostent *host; FILE *fp; char ch[1024]; int byte_send=0; //int a=MSG_DONTWAIT; //int opt=MSG_DONTWAIT; fd_set rfds; struct timeval tv; int retval, maxfd; if(argc!=3) { printf("format: %s IP file_name\n",argv[0]); return 0; } if((host=(gethostbyname(argv[1])))==NULL) { printf("error in gethostby name. \n"); return 0; } if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) { printf("error in socket create.\n"); return 0; } printf("创建socket成功,sockfd=%d\n",sockfd); //printf("运行至此1\n"); serv_addr.sin_family=AF_INET; serv_addr.sin_port =htons(SERVERPORT); serv_addr.sin_addr=*((struct in_addr*)host->h_addr); bzero(&(serv_addr.sin_zero),sizeof(serv_addr.sin_zero)); //printf("运行至此2\n"); while(1) { if((connectfd=connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr )))==-1) { printf("error in connect.\n"); printf("连接失败:connectfd=%d\n",connectfd); sleep(5); continue; } printf("连接成功:connectfd=%d\n",connectfd); break; } //printf("运行至此3\n"); fp=fopen(*(argv+2),"rb"); memset(ch,0,sizeof(ch)); while(1) { memset(ch,0,sizeof(ch)); sendfd=fread(ch,sizeof(char),1024,fp); if(sendfd<0) break; sleep(1); //printf("sendfd=%d\n",sendfd); byte_send=send(sockfd,ch,sendfd,0); //printf("byte_send=%d,%s\n",byte_send,strerror(errno)); //memset(&ch,0,sizeof(ch)); //printf("发送内容:%s\n",ch); sleep(3); while(1) { //void FD_ZERO (fd_set *fdset); // 初始化文件描述集合 //void FD_SET (int fd, fd_set *fdset); // 将描述符加入到集合中 //void FD_CLR (int fd, fd_set *fdset); // 将描述符中集合中删除 //int FD_ISSET (int fd, fd_set *fdset); // 检查描述符集合中指定的文件描述符是否可读写 /*把可读文件描述符的集合清空*/ FD_ZERO(&rfds); /*把标准输入的文件描述符加入到集合中*/ FD_SET(0, &rfds); maxfd = 0; /*把当前连接的文件描述符加入到集合中*/ FD_SET(sockfd, &rfds); /*找出文件描述符集合中最大的文件描述符*/ if(maxfd < sockfd) maxfd = sockfd; /*设置超时时间*/ tv.tv_sec = 5; tv.tv_usec = 0; /*等待聊天*/ retval = select(maxfd+1, &rfds, NULL, NULL, &tv); if(retval == -1) { printf("select出错,客户端程序退出\n"); break; } else if(retval == 0) { //printf("客户端没有任何输入信息,并且服务器也没有信息到来,waiting...\n"); //continue; printf("客户端输出信息完毕,等待下一次输出\n"); break; } else { /*服务器发来了消息*/ if(FD_ISSET(sockfd,&rfds))// 检查描述符集合中指定的文件描述符是否可读写 { /******接收消息*******/ memset(ch,0,sizeof(ch)); recvfd=recv(sockfd,ch,sizeof(ch),0); if(recvfd==-1) { //printf("运行至此7\n"); printf("error in recv.\n"); continue; } //printf("recvfd=%d\n",recvfd); printf("%s\n",ch); } } } } printf("传送结束!\n"); fclose(fp); close(connectfd); return 0; }
④ linux 下编写的一个带超时限制的read()
输入输出都有缓冲区概念,在输入hello world不回车,其实已经放到了read缓冲区中,在超时关闭read()的时候,系统会flush缓冲区,其实就是把它放到内存中,所以这时候n已经有值了,write当然会输出hello world了。
⑤ linux下调用read函数出现的问题!
if((((((((from_fd=open(argv[1],O_RDONLY|O_NONBLOCK))))))))==-1)
你的那个if永远都是成功open,最重要的是把from_id的值刷成xxxx了。
注意使用 if时候 ==的级别。
提醒下程序结尾没有return值。
⑥ shell read读取到错误的输入
Linux有缓冲区的概念,read是从输入缓冲区去读的,如果缓冲区里已经有数据了,那么就直接拿过来了。在readss之前先用另一条read语句将缓冲区数据读走,缓冲区即清空了,这时再输入就可以被readss读到了。
这固然是一个办法,但同时也带来一个问题:如果在20s等待时间内没有任何输入,那么脚本就会要求你输入两次。
所以,完善的解决方案应该如下:
sleep20
read-t1discard
read-p"Pleaseinput:"ss
echo$ss
使用read的超时机制,超时时间设为1s,这已经是最短的超时时间设置了。
这样即使在等待时间内没有任何输入,第一条read命令在1s超时后也会自动退出。
参考:http://superuser.com/questions/276531/clear-stdin-before-reading
⑦ 求教,linux read函数 出错
type read 看看你的read是不是bash的内置命令,我怀疑你有重名的命令或者alias
⑧ 如何解决linux文件系统read
解决方法
:使用fsck手动修复,具体操作如下:
使用root进入单用户模式,运行
fsck.ext3
-y
/dev/vda3
说明:ext3的文件系统使用fsck.ext3,ext4文件系统使用fsck.etx4。/dev/vda3是系统/根分区。运行完毕后,reboot重启系统就恢复正常。