对于read和write操作而言是无缓冲的操作,我们从文件读取的时候(终端也是一样,因为文件描述符0,1,2分别表示),对于该read而言的话只有在遇到EOF(ctrl+D)的时候才会读取终止,相应的进行返回,而对于\n而言(ENTER)是不会造成终端的读取终止,而相应的该字符是当做一个描述符进行操作的,而且每一次对一个字符串进行填写的话,会把之前的部分给覆盖掉,且机器不会再给你添加一个\n,见下面代码;
上面的话,当我敲入abc以及enter的话返回的是一个错误,关键是enter也是一个字符,相应的修改之后,令
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# define MAXLINE 10
int main(int argc, char* argv[]) {
int n,i;
char buf[MAXLINE];
bzero(buf, sizeof(buf));
while((n=read(fileno(stdin), buf, MAXLINE))>0) {
// if(n==0) {
// break;
// } else {
printf("sizeof(buf) = %d\tstrlen(buf) = %d\n", sizeof(buf), strlen(buf));
for(i=0;i<MAXLINE;i++) {
write(fileno(stdout), buf+i, 1);
}
printf("%s",buf);
// }
}
exit(0);
}
这个的话当你敲如enter,返回的是长度为10,buf长度为1,敲入ctrl+D(EOF)的时候返回的是直接跳出来。可见机器不会给你添加一个\n。
# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>
# include <errno.h>
# include <strings.h>
int main(int argc, char* argv[]) {
int i;
char buf[10];
bzero(buf, sizeof(buf));
if(read(STDIN_FILENO, buf, 3)!=3) {
printf("strerror: %s\n", strerror(errno));
exit(0);
}
for(i=0;i<10;i++) {
write(STDOUT_FILENO, buf+i, 1);
}
if(read(STDIN_FILENO, buf, 1)!=1) {
printf("strerror: %s\n", strerror(errno));
exit(0);
}
for(i=0;i<10;i++) {
write(STDOUT_FILENO, buf+i, 1);
}
exit(0);
}
上面的话,当我敲入abc以及enter的话返回的是一个错误,关键是enter也是一个字符,相应的修改之后,令
read(STDIN_FILENO, buf, 3)>0
返回的就是4,之后我再次的在该位置写cd,但是对应的结果就是换行后直接输出,由于在abc+\n后是\0,那么的话上面第二次读2个的话,之后会第一个度\n,第二次遇到\0
结束,\n覆盖a,所以直接输出bc,而不会读,原因是对于终端设备,维护的是一个行缓冲队列。