Loading

C语言--unistd.h等

在此随手记录一些unistd.h等文件中的函数

dup

头文件unistd.h
声明:int dup(int oldfd)
功能:复制文件描述符,重定向输入输出
返回值:成功返回当前系统可用的最小整数值,否则返回-1

dup2

头文件unistd.h
声明:int dup2(int oldfd, int newfd)
功能:复制文件描述符,重定向输入输出
返回值:返回一个不小于newfd的整数值,分两种情况:

  • 如果newfd已经打开,则先将其关闭,在复制文件描述符;
  • 如果newfd等于oldfd,则返回newfd,而不关闭它;

复制文件描述符之后,新旧文件描述符的特点

  1. 使用dup或dup2复制文件描述符后,新文件描述符和旧文件描述符指向同一个文件,管道或网络连接,共享文件的锁定、读写位置和各项权限。
  2. 当关闭新的文件描述符时,通过旧文件描述符可操作文件。
  3. 当关闭旧的文件描述符时,通过新文件描述符可操作文件。

注意:新旧文件描述符是共享文件偏移量和文件状态标志的,也就是说如果其中一个文件描述符使用了seek修改文件偏移量,那么另外一个也会改变。

open

头文件:#include <fcntl.h>
声明:int open(const char * pathname, int flags);int open(const char * pathname, int flags, mode_t mode);
功能:打开文件
参数:

  • pathname:指向文件路径字符串
  • flags:
参数 说明
O_RDONLY 以只读方式打开文件
O_WRONLY 以只写方式打开文件
O_RDWR 以可读可写方式打开文件
上述三种旗标是互斥的,也就是不可同时使用,但可与下列的旗标利用OR(|)运算符组合。
O_CREAT 若欲打开的文件不存在则自动建立该文件
O_EXCL 如果O_CREAT也被设置,此指令会去检查文件是否存在,文件若不存在则建立该文件,否则将导致打开文件错误。此外,若O_CREAT与O_EXCL同时设置,并且欲打开的文件为符号连接,则会打开文件失败
O_NOCTTY 如果欲打开的文件为终端机设备时。则不会将该终端机当成进程控制终端机
O_TRUNC 若文件存在并且以可写的方式打开时,此旗标会令文件长度清为0。而原来存于该文件的资料也会消失
O_APPEND 当读写文件时会从文件尾开始移动,也就是所写入的数据会以附加的方式加入到文件后面
O_NONBLOCK 以不可阻断的方式打开文件,也就是无论有无数据读取或等待,都会立即返回进程之中
O_NDELAY 同O_NONBLOCK
O_SYNC 以同步的方式打开文件
O_NOFOLLOW 如果参数pathname所指的文件为一符号连接,则会令打开文件失败
O_DIRECTORY 如果参数pathname所指的文件并非为一目录,则会令打开文件失败
  • mode有以下数种组合,只有在建立新文件的时候才会生效,真正件文件会受到umask值的影响,因此该文件权限应该为mode-umask
参数 说明
S_IRWXU 00700权限,代表该文件所有者具有可读、可写及可执行的权限
S_IRUSR 或 S_IREAD 00400权限,代表该文件所有者具有可读取的权限。
S_IWUSR 或 S_IWRITE 00200权限,代表该文件所有者具有可写入的权限。
S_IXUSR 或 S_IEXEC 00100权限,代表该文件所有者具有可执行的权限。
S_IRWXG 00070权限,代表该文件用户组具有可读、可写及可执行的权限。
S_IRGRP 00040权限,代表该文件用户组具有可读的权限。
S_IWGRP 00020权限,代表该文件用户组具有可写入的权限。
S_IXGRP 00010权限,代表该文件用户组具有可执行的权限。
S_IRWXO 00007权限,代表其他用户具有可读、可写及可执行的权限。
S_IROTH 00004权限,代表其他用户具有可读的权限。
S_IWOTH 00002权限,代表其他用户具有可写入的权限。
S_IXOTH 00001权限,代表其他用户具有可执行的权限。

返回值:若所有欲核查的权限都通过了检查则返回0,表示成功,只要有一个权限被禁止则返回-1

错误代码 说明
EEXIST 参数pathname 所指的文件已存在,却使用了O_CREAT 和O_EXCL 旗标。
EACCESS 参数pathname 所指的文件不符合所要求测试的权限。
EROFS 欲测试写入权限的文件存在于只读文件系统内。
EFAULT 参数pathname指针超出可存取内存空间。
EINVAL 参数mode不正确。
ENAMETOOLONG 参数pathname太长。
ENOTDIR 参数pathname不是目录。
ENOMEM 核心内存不足。
ELOOP 参数pathname有过多符号连接问题。
EIO I/O存取错误。
posted @ 2023-01-04 17:17  henryLyg  阅读(485)  评论(0编辑  收藏  举报