read(2)和write(2)都有一个特点: 期待被处理的数据与已经被处理的数据量可以不一致.
比如:
char buffer[5000];
size_t count = read(1, buffer, 4096);
调用read读4096个bytes, 但是是不是真的已经读了4096个bytes, 这是没有必然要求的.
socket的I/O是最明显的.
如果不一致, 就要求程序员去处理. 不过, 这都是常事了, 都有满足这样需求的函数.
但是, 这就需要程序员可以自己分清这两种情况的函数.
不要认为sys.stdin.read(4096)和os.read(sys.stdin.fileno(), 4096)是一样的.
$ (echo -e "12345\n"; sleep 10) | python -c '
import sys
print sys.stdin.read(4096)'
上面的python程序是被block了10秒才运行print的. 但是下面的是马上收到数据的:
$ (echo -e "12345\n"; sleep 10) | python -c '
import sys
import os
print os.read(sys.stdin.fileno(), 4096)'
C的standard I/O是一组保证可以返回指定数据(量)的函数
standard I/O增加了buffer, 以减少read, write的次数. 原则就是每次调用read的时候读入BUF_SIZE的数据到buffer空间中, 下面是read函数的原型:
ssize_t read(int fd, void *buf, size_t count);
count是会根据file descriptor的不同变化, 如:
1. terminate device时为1024
2. 不是terminate device时为是page size, 或者程序员使用setvbuf指定
standard I/O有三个种非格式化函数:
1. character-at-a-time I/O
2. line-at-a-time I/O
3. direct I/O
无论使用哪种函数, 它都是如下的方式:
read(fd, buffer_ptr, BUF_SIZE);
那怕你只是想使用fgetc得到一个字符. 都是调用上面的函数. 一般情况BUF_SIZE >= 1024.
standard I/O除了缓存外. 还保证了返回的数据是想得到的, 如:
1. character-at-a-time I/O时, 保证返回一个字符
2. line-at-a-time I/O时, 保证返回一行数据, 以NULL结尾.
3. direct I/O时, 保证返回指定的数据结构.
否则, 会多次调用上面的read函数, 直到取得的数据满足要求, 过程中会出来下面的情况:
1. block;
2. EOF;
3. Error
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.