美文网首页
iovec结构体的定义与使用

iovec结构体的定义与使用

作者: Jamza | 来源:发表于2021-07-20 20:28 被阅读0次

    定义

    struct iovec 结构体定义了一个向量元素,通常这个 iovec 结构体用于一个多元素的数组,对于每一个元素,iovec 结构体的字段 iov_base 指向一个缓冲区,这个缓冲区存放的是网络接收的数据(read),或者网络将要发送的数据(write)。iovec 结构体的字段 iov_len 存放的是接收数据的最大长度(read),或者实际写入的数据长度(write)。

    一般 struct iovec 结构体的通常定义为:

    struct iovec {
        /* Starting address (内存起始地址)*/
        void  *iov_base;   
    
        /* Number of bytes to transfer(这块内存长度) */
        size_t iov_len;  
    };
    

    在 linux 中,使用这样的结构体变量作为参数的函数很多,常见的包括:

    #include <sys/uio.h> 
    ssize_t readv(int fd, const struct iovec *iov, int iovcnt);
    ssize_t writev(int fd, const struct iovec *iov, int iovcnt);
    ssize_t preadv(int fd, const struct iovec *iov, int iovcnt, off_t offset);
    ssize_t pwritev(int fd, const struct iovec *iov, int iovcnt,off_t offset);
    ssize_t preadv2(int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags);
    ssize_t pwritev2(int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags);
    

    示例

    示例代码,向终端(屏幕)打印字符串:i am happy:

    /*************************************************************************
     * File Name: struct_iovec.c
     * Author:    The answer
     * Function:  Other  
     * Mail:      2412799512@qq.com 
     * Created Time: 2017年06月17日 星期六 20时36分21秒
     ************************************************************************/
    
    #include<stdio.h>
    #include<sys/uio.h>
    #include<unistd.h>
    #include<fcntl.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    #include<stdlib.h>
    #include<string.h>
    
    void sys_err(const char *ptr,int num)
    {
        perror(ptr);
        exit(-1);
    }
    
    int main(int argc,char **argv)
    {
        struct iovec iov[3];
        char *p1 = "i";
        char *p2 = " am";
        char *p3 = " happy.\n";
        iov[0].iov_base = p1;
        iov[0].iov_len = strlen(p1);
    
        iov[1].iov_base = p2;
        iov[1].iov_len = strlen(p2);
    
        iov[2].iov_base = p3;
        iov[2].iov_len = strlen(p3);
        ssize_t ret = writev(STDOUT_FILENO,iov,3);
        if(ret < 0)
        {
            sys_err("writev",-1);
        }
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:iovec结构体的定义与使用

          本文链接:https://www.haomeiwen.com/subject/yyqsmltx.html