【网络编程】Linux高级O/I函数


1、用于创建文件描述符的函数

1.1、pip函数

  pipe创建管道来实现进程间通信

#include <unistd.h>
int pipe(int fd[2]);

  使用pipe创建的管道使用两个文件描述符fd[0]fd[1]来构成管道的两端,fd[0]只能用于从管道中读出数据,fd[1]只能向管道中写入数据

  • 要实现双向的数据传输,则要使用两个管道
  • 管道默认的容量限制为65336B,但是可以用fcntl来修改管道容量。

1.2、双向管道

  使用socketpair创建的双向管道既可读也可以写

#include <sys/types.h>
#include <sys/socket.h>
int socketpair(int domain, int type, int protocol, int fd[2]);
//domain只能使用AF_UNIX
//type 指出服务类型,主要有SOCK_STREAM流服务(TCP)和SOCK_UGRAM数据报(UDP)
//protocol几乎所有情况下设置为0

1.3、dup和dup2函数

  dup创建一个新的文件描述符,该新文件描述符指向与file_descriptor相同的文件、管道或者网络
  dup2是将file_descriptor_two指向与file_descriptor_one相同的文件

#include <unistd.h>
int dup(int file_descriptor);
int dup2(int file_descriptor_one, int file_descriptor_two);
  • dup总是返回系统中最小的可用文件描述符
  • dup2返回系统中第一个不小于file_descriptor_two的值

2、数据读写函数

2.1 readv函数和writev函数

#include <sys/uio.h>
ssize_t readv(int fd, const struct iovec* vector, int count);
ssize_t writev(int fd, const struct iovec* vector, int count);
//fd表示目标文件描述符
//vector是一个iovec类型的结构体,表示一块内存区
//count表示vector的长度
//成功时返回读出/写入的字节数,失败返回-1

2.2、sendfile函数

  sendfile函数实现了两个文件描述符之间直接传递数据(完全在内核之中操作),避免了用户缓冲区以及内核缓冲区之间的数据拷贝,这也被称为零拷贝。

#include <sys/sendfile.h>
ssize_t sendfile(int out_fd, int in_fd, off_t* offset, int count);
//out_fd, in_fd分别代表待写入文件描述符和待读出文件描述符
//offset指出了读出的位置
//count指定了传输的字节数

2.3、mmap函数和munmap函数

  mmap函数用于申请一段内存空间,munmap则用于释放这一段空间。这段空间主要用作进程间通信的共享内存

#include <sys/mman.h>
void* mmap(void* start, size_t length, int prot, int flags, int fd, off_t offset);
int munmap(void* start, size_t length);
//start指的是这段内存的起始地址
//length指定了内存块的长度
//prot设置内存段的访问权限
//flags参数指定了内存段内容被修改后程序的行为
//fd是被映射文件对应的文件描述符
//offset设置从文件何处开始映射
//mmap成功返回指向目标内存区域的指针,失败返回MAP_FILED并设置error
//munmap成功返回0,失败返回-1并设置error
  • startNULL则自动分配地址

2.4、splice函数

  splice函数用于在两个文件描述符之间移动数据,也是零拷贝操作。

#include <fcntl.h>
ssize_t splice(int fd_in, loff_t* off_in, int fd_out, loff_t* off_out,
               size_t len, unsigned int flags);
//fd_in是待输入数据的文件描述符
//len表示指定数据流的长度
//flags表示控制数据如何流动
//调用成功返回移动字符的数量,失败返回-1并设置error
  • fd_in是一个管道文件描述符,off_in必须为NULL,此时表示从输入数据流的当前偏移位置读入
  • fd_in不是一个管道文件描述符,off_in不为NULL,则它必须指出具体的偏移位置
  • fd_out/off_out的含义与fd_in/off_in相同,但是指的是输出流

2.5 tee函数

  tee函数用于在两个管道文件描述符之间移动数据,也是零拷贝操作。

#include <fcntl.h>
ssize_t tee(int fd_in, int fd_out, size_t len, unsigned int flags);
//fd_in是待输入数据的文件描述符,fd_out是待输出数据的文件描述符
//成功返回复制的字节数量,失败返回-1并设置error

3、控制I/O行为和属性的函数

3.1、fcntl函数

#include <fcntl.h>
int fcntl(int fd, int cmd,...);
//fd是被操作的文件描述符,cmd代表操作类型
//成功时的返回值根据操作的不同而不同,失败返回-1并设置error
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rockict_z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值