1,dup:影印文件描述符(复制多一个文件描述符出来)
#include <unistd.h>
int dup(int oldfd);
由系统自动给你分配一个
int dup2(int oldfd, int newfd);
自己指定一个文件描述符newfd
#define _GNU_SOURCE /* See feature_test_macros(7) */
#include <fcntl.h> /* Obtain O_* constant definitions */
#include <unistd.h>
int dup3(int oldfd, int newfd, int flags);
新建进程的时候,多家一个flags判断,这个flags只能添加O_CLOEXEC,代表新建进程的时候关闭这个文件描述符
oldfd:旧的文件描述符
newfd:指定的新文件描述符
函数返回值:
成功返回分配的文件描述符,失败返回-1,errno会被设置
2,memset:往指定的内存填充某个数据
#include <string.h>
void *memset(void *s, int c, size_t n);
s:指定的内存
c:填入的内容
n:指定内存的大小
返回值:返回s
3, bzero:指定内存清0
#include <strings.h>
void bzero(void *s, size_t n);
s:指定的内存
n:指定内存的大小
4,fcntl:文件属性控制
#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* arg */ );
fd:需要控制的文件描述符
cmd:控制的内容是什么
F_DUPFD (int):
影印文件描述符,后面的参数是需要指定映射的文件描述符
类似于dup2
F_DUPFD_CLOEXEC:类似于dup3,映射文件描述符的时候添加多一个关闭标志位FD_CLOEXEC(也就是open函数中的O_CLOEXEC)
F_GETFD (void):获取文件描述符的进程关闭标志位
F_SETFD (int):设置文件描述符的进程关闭标志位
F_GETFL (void):获取打开文件的操作标志位状态(open里面的flags)
F_SETFL (int):设置文件中的操作标志位状态
不课使用的有:O_RDONLY, O_WRONLY, O_RDWR,O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC
能用的只有:O_APPEND, O_ASYNC, O_DIRECT, O_NOATIME, and O_NONBLOCK
5,mmap:内存映射
将一个设备或者是一段物理内存直接映射成为一个虚拟内存中的地址,可以直接引用
#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags,
int fd, off_t offset);
int munmap(void *addr, size_t length);
addr:映射的虚拟内存的起始地址,如果为NULL,则是由系统自动选择内存地址帮我们映射
length:长度为多长(建议以页为单位)
prot:操作权限:
PROT_EXEC Pages may be executed.:执行权限
PROT_READ Pages may be read. :读取
PROT_WRITE Pages may be written.:写入
PROT_NONE Pages may not be accessed.:无权限
flags:操作标志位
MAP_SHARED:内存共享
MAP_PRIVATE:内存私有
fd:需要映射的文件描述符
offset:基于原本的位置上是否需要偏移
本文介绍了文件描述符的相关操作,包括dup、dup2、dup3等函数的使用方法及区别,以及内存操作函数memset、bzero的作用。此外,还详细讲解了文件属性控制函数fcntl的多种用途和内存映射函数mmap的具体实现。

被折叠的 条评论
为什么被折叠?



