LINUX环境下read细节

对于read和write操作而言是无缓冲的操作,我们从文件读取的时候(终端也是一样,因为文件描述符0,1,2分别表示),对于该read而言的话只有在遇到EOF(ctrl+D)的时候才会读取终止,相应的进行返回,而对于\n而言(ENTER)是不会造成终端的读取终止,而相应的该字符是当做一个描述符进行操作的,而且每一次对一个字符串进行填写的话,会把之前的部分给覆盖掉,且机器不会再给你添加一个\n,见下面代码;
# 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,而不会读,原因是对于终端设备,维护的是一个行缓冲队列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值