http://blog.csdn.net/ly21st http://ly21st.blog.chinaunix.net
分类: LINUX
2011-09-16 14:25:16
ssize_t read(int fd, void * buf, size_t nbytes);
ssize_t write(int fd, const void * buf, size_t nbytes);
read()函数读入缓冲区buf[]最多nbytes个字节,实际读的字节是返回值,如果发生错误,返回-1(及errno)。返回值0表示到达了文件的结尾。没有与文件结尾关联的错误码,因为这不是错误。
在某些度环境,可能接收的字节数少于nbytes参数请求的字节数。在从常规文件读时,当尝试满足计数时达到了文件结尾时,就可能发生这种情况。在其他情况下,当从常规文件读时,保证直到nbytes返回时,函数不会返回。
在所有其他环境下,比如从套接口读时,计数nbytes用作最大数,从1到nbytes的任何字节数都可以返回:
提示:对于任何慢设备,如果一个信号处理程序处理了一个信号,read()就可能返回错误EINTR。当接收到这个错误时,只需重试read调用。
不要把常规文件看作是慢设备。
write函数
write()函数从所提供的恰好nbytes个字节的缓冲区buf写出。它返回实际所写的字节数。如果发生错误,返回-1(及errno)。
对常规文件,write应该总是写所请求的nbytes个字节。在其他环境,返回值指出实际写入字节数。
提示:
对于任何慢设备,如果信号处理程序处理了信号write(),就可能返回错误EINTR,当接收到这个错误时,只需重试write()。
#include
#include
#include
#include
#include
#include
int main()
{
int z;
off_t o;
int fd;
fd=open("data.bat",O_CREAT|O_WRONLY|O_TRUNC,0640);
if (fd==-1)
printf("create data.bat error\n");
// o=lseek(fd,1024*1024*1024,SEEK_SET);
ftruncate(fd,1024*1024*1024);
if (o == (off_t)-1 )
printf("lseek error\n");
z=write(fd, "END-OF-SPARSE-FILE",18);
if (z==-1)
printf("write error\n");
close(fd);
return 0;
}
强迫把数据写到媒介上的函数:
void sync(void);
int fsync(fd);
4.7 分散读写
#include
ssize_t writev( int fd, const struct iovec *iov, int cnt );
ssize_t readv( int fd, const struct iovec *iov, int cnt );
返回值:传输字节数,出错时返回-1.
参数说明:
iov是一组iovec结构的指针,iovec结构如下:
struct iovec {
char *iov_base; /*基本地址指针,指向缓冲区*/
size_t iov_len; /*指定缓冲区长度*/
};
说明:这个定义取自系统,许多系统现在定义基本地址指针为void *iov_base;
cnt是数组中iovec结构的个数,即分开缓冲区的个数。
这两个函数可以用于套接字及任何类型的文件描述符。
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8
9 int main()
10 {
11 int n;
12 struct iovec iov[4];
13
14 static char buf1[]="<<<";
15 static char buf2[]="hello,world";
16 static char buf3[]=">>>";
17 static char buf4[]="\n";
18
19 iov[0].iov_base=buf1;
20 iov[0].iov_len=strlen(buf1);
21 iov[1].iov_base=buf2;
22 iov[1].iov_len=strlen(buf2);
23 iov[2].iov_base=buf3;
24 iov[2].iov_len=strlen(buf3);
25 iov[3].iov_base=buf4;
26 iov[3].iov_len=strlen(buf4);
27
28 n=writev(1,iov,4);
29 if (n == -1)
30 printf("write iovec error\n");
31 return 0;
32 }
33
4.8 确定tty名称
char * ttyname( int fd);
int isatty(int fd);
如果isatty返回true,则ttyname返回tty设备的串指针,反之返回空指针,errno值不受影响。
1 #include
2 #include
3
4 void tty_info(int fd)
5 {
6 int b=isatty(fd);
7 printf("%d is a tty: %s\n",fd, b? "is":"isn't");
8 if (b)
9 printf("the tty name is %s\n", ttyname(fd));
10 }
11
12 int main()
13 {
14 tty_info(0);
15 tty_info(1);
16 tty_info(2);
17
18 return 0;
19 }