• man(2) readv writev


    #include <sys/uio.h>

    ssize_t readv(int fd, const struct iovec *iov, int iovcnt);

    unix高级环境编程中的定义:

    【ssize_t readv(int filedes,const struct iovec iov[ ],int iovcnt) ;
    ssize_t writev(int filedes,const struct iovec iov[ ],int iovcnt) ; 】

    ----------------------------------------------------------------------------

    1 #include <stdio.h>
    2 #include <sys/types.h>
    3 #include <sys/stat.h>
    4 #include <fcntl.h>
    5 #include <sys/uio.h>
    6 #include <unistd.h>
    7
    8 int main()
    9 {
    10 struct iovec iov[2];
    11 char buf[12],str[12];
    12 int fd = open("1.txt",O_RDONLY);
    13 if(fd == -1)
    14 return -1;
    15 iov[0].iov_base = buf;
    16 iov[0].iov_len = 12;
    17 iov[1].iov_base = str;
    18 iov[1].iov_len = 12;
    19 int n = readv(fd, iov, 2);

    buf[11] = 0;//添加这个

    20 printf("n:%d ", n);
    21 //printf("buf:%s ",buf);
    22 //printf("str:%s ",str);
    23 puts(buf);
    24 puts(str);
    25 close(fd);
    26 return 0;
    27 }

    ----------------------------------------------------------------------------

    运行结果很奇怪:第一个缓冲区溢出了

    tarena@ubuntu:~/mon$ ./a.out
    n:23
    buf:aaaaaaaaaaaabbbbbbbbbb

    str:bbbbbbbbbb

    解决办法:

    int main()
    9 {
    10 struct iovec iov[3];
    11 char buf[13],str[13],str2[13];
    12 int fd = open("1.txt",O_RDONLY);
    13 if(fd == -1)
    14 return -1;
    15 iov[0].iov_base = buf;
    16 iov[0].iov_len = 12;
    17 iov[1].iov_base = str;
    18 iov[1].iov_len = 12;
    19 iov[2].iov_base = str2;
    20 iov[2].iov_len = 12;
    21 int n = readv(fd, iov, 3);
    22 buf[12] = 0;
    23 str[12] = 0;
    24 printf("n:%d ", n);
    25 printf("buf:%s ",buf);
    26 printf("str:%s ",str);
    27 printf("str2:%s ",str2);
    28 close(fd);
    29 return 0;
    30 }

    当你要读入12个的时候申请13个存储空间读入的长度iov_len = 12,并且手动在末尾添加字符串结束标志。

    ----------------------------------------------------------------------------

    ssize_t writev(int fd, const struct iovec *iov, int iovcnt);

    ----------------------------------------------------------------------------

    1 #include <stdio.h>
    2 #include <sys/types.h>
    3 #include <sys/stat.h>
    4 #include <fcntl.h>
    5 #include <sys/uio.h>
    6 #include <unistd.h>
    7 #include <string.h>
    8 int main()
    9 {
    10 struct iovec iov[2];
    11 char buf[12] = "hello,lyy",str[12] = "nihao,lyy";
    12 int fd = open("2.txt",O_WRONLY | O_CREAT);
    13 if(fd == -1)
    14 return -1;
    15 iov[0].iov_base = buf;
    16 iov[0].iov_len = strlen(buf);
    17 iov[1].iov_base = str;
    18 iov[1].iov_len = strlen(str);
    19 int n = writev(fd, iov, 2);
    20 printf("n:%d ", n);
    21 close(fd);
    22 return 0;
    23 }

    ----------------------------------------------------------------------------

    运行结果正确,但是为什么需要超级用户才能查看呢?

    tarena@ubuntu:~/mon$ sudo cat 2.txt
    hello,lyynihao,lyytarena@ubuntu:~/mon$

    ---------------------------------------------------------------------------- 

    ssize_t preadv(int fd, const struct iovec *iov, int iovcnt, off_t offset);

    1 #include <stdio.h>
    2 #include <sys/types.h>
    3 #include <sys/stat.h>
    4 #include <fcntl.h>
    5 #include <sys/uio.h>
    6 #include <unistd.h>
    7 int main()
    8 {
    9 int fd = open("4.txt",O_RDWR|O_CREAT);
    10 if(fd == -1) return -1;
    11 struct iovec iov[3];
    12 char str1[12],str2[12],str3[12];
    13 iov[0].iov_base = str1;
    14 iov[0].iov_len = 3;
    15 iov[1].iov_base = str2;
    16 iov[1].iov_len = 4;
    17 iov[2].iov_base = str3;
    18 iov[2].iov_len = 5;
    19 preadv(fd, iov, 3, 4);
    20 str1[iov[0].iov_len] = 0;
    21 str2[iov[1].iov_len] = 0;
    22 str3[iov[2].iov_len] = 0;
    23 printf("str1:%s str2:%s str3:%s ",str1,str2,str3);
    24 close(fd);
    25 return 0;
    26 }

    ssize_t pwritev(int fd, const struct iovec *iov, int iovcnt, off_t offset);

    1 #include <stdio.h>
    2 #include <sys/types.h>
    3 #include <sys/stat.h>
    4 #include <fcntl.h>
    5 #include <sys/uio.h>
    6 #include <unistd.h>
    7 #include <string.h>
    8 int main()
    9 {
    10 int fd = open("4.txt",O_RDWR|O_CREAT);
    11 if(fd == -1) return -1;
    12 struct iovec iov[3];
    13 char str1[12] = "hello,lyy",str2[12] = "nihao,lyy",str3[36] = "nice to meet you";
    14 iov[0].iov_base = str1;
    15 iov[0].iov_len = strlen(str1);
    16 iov[1].iov_base = str2;
    17 iov[1].iov_len = strlen(str2);
    18 iov[2].iov_base = str3;
    19 iov[2].iov_len = strlen(str3);
    20 pwritev(fd, iov, 3, 3);
    21 close(fd);
    22 return 0;
    23 }

    --------------------------------------------------------------------------------------------------------

    这两个举例不太好举

    ssize_t preadv2(int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags);

    flags:RWF_SYNC  RWF_DSYNC

    ssize_t pwritev2(int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags);

    flags:RWF_NOWAI

    ---------------------------------------------

    RWF_HIPRI只用于下列条件

    其中this feature is usable only on a file descriptor opened using the O_DIRECT flag.

    ---------------------------------------------------------------------------------------------------------

    #include <unistd.h>

    ssize_t pread(int fd, void *buf, size_t count, off_t offset);

    从第offset个开始读

    1 #include <stdio.h>
    2 #include <string.h>
    3 #include <unistd.h>
    4 #include <sys/types.h>
    5 #include <sys/stat.h>
    6 #include <fcntl.h>
    7
    8 int main()
    9 {
    10 char buf[12];
    11 int fd = open("3.txt",O_RDONLY);
    12 int n = pread(fd, buf, 12,3);
    13 buf[n] = 0;
    14 printf("n = %d buf:%s ",n,buf);
    15 close(fd);
    16 return 0;
    17 }

    返回值比实际读到的多一个,手动buf[n]置为0

    -------------------------------------------------------------------------------------

    ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);

    从第offset个开始写,从0开始;(略)

  • 相关阅读:
    getline函数
    Java获取某年某月的第一天
    计划任务中使用NT AUTHORITYSYSTEM用户和普通管理员用户有什么差别
    Windows 7系统安装MySQL5.5.21图解
    C#高性能大容量SOCKET并发(十一):编写上传client
    Linux 终端訪问 FTP 及 上传下载 文件
    完毕port(CompletionPort)具体解释
    ping不通的几种可能原因
    Apple Swfit UI控件实现
    js中取session的值
  • 原文地址:https://www.cnblogs.com/xpylovely/p/11008693.html
Copyright © 2020-2023  润新知