Chinaunix首页 | 论坛 | 博客
  • 博客访问: 311022
  • 博文数量: 214
  • 博客积分: 4258
  • 博客等级: 上校
  • 技术积分: 2021
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-02 09:16
个人简介

http://blog.csdn.net/ly21st http://ly21st.blog.chinaunix.net

文章分类

全部博文(214)

文章存档

2018年(16)

2015年(1)

2014年(2)

2012年(22)

2011年(173)

分类: LINUX

2011-09-16 14:25:16

4.2 读和写

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用作最大数,从1nbytes的任何字节数都可以返回:

 

   提示:对于任何慢设备,如果一个信号处理程序处理了一个信号,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 }

阅读(282) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~