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
,而不关闭它;
复制文件描述符之后,新旧文件描述符的特点
- 使用dup或dup2复制文件描述符后,新文件描述符和旧文件描述符指向同一个文件,管道或网络连接,共享文件的锁定、读写位置和各项权限。
- 当关闭新的文件描述符时,通过旧文件描述符可操作文件。
- 当关闭旧的文件描述符时,通过新文件描述符可操作文件。
注意:新旧文件描述符是共享文件偏移量和文件状态标志的,也就是说如果其中一个文件描述符使用了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存取错误。 |