#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);//long 长整型
int fcntl(int fd, int cmd, struct flock *lock);
可见fcntl函数是一个可变参数函数(函数的形参数目和类型不只是一种)。
作用:改变已经打开的文件的属性,如一个文件以只读的方式打开后,如果想要再不关闭重新打开文件的前提下可以向文件里追加写入内容,则可以使用fcntl函数来修改其属性。
下面仅介绍常用的情况:第一个函数和第二个函数。
int fcntl(int fd, int cmd); 用于实现文件描述符的拷贝(重定向),功能与dup一样。cmd采用参数:F_DUPFD(宏定义)。 返回值则为复制的文件描述符,错误返回-1。
int fcntl(int fd, int cmd, long arg); 用于实现:1.获得文件状态标记;2.设置文件状态标记。
获得文件状态标记:cmd指定为F_GETFL,第三个参数arg直接为0即可,返回值即为文件状态标记:O_RDONLY(只读打开)、O_WRONLY(只写打开)、O_RDWR(读写打开)、O_EXEC(执行打开)、O_SEARCH(搜索打开目录)、O_APPEND(追加写)、O_NONBLOCK(非阻塞模式),这些参数都是宏定义,为int型。错误则返回-1。
设置文件状态标记(即在文件打开的情况下可修改文件属性):cmd参数为F_SETFL,第三个参数arg(长整型)为:O_APPEND(可追加写)、O_NONBLOCK(设置为非阻塞模式)。
其它功能:1.获得或设置文件描述符标记,cmd参数为:F_GETFD或F_SETFD。2.获得或设置异步I/O所有权,cmd参数为:F_GETOWN或F_SETOWN。3.获得或设置记录锁,cmd参数为:F_GETLK、F_SETLK或F_SETLKW。
//在文件只读情况下,修改为可追加写入
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>int main(void)
{int fd;int flag;// 测试字符串char *p = "我们是一个有中国特色的社会主义国家!!!!!!";char *q = "社会主义好哇。";// 只写的方式打开文件fd = open("test.txt", O_WRONLY);if(fd == -1){perror("open");exit(1);}// 输入新的内容,该部分会覆盖原来旧的内容if(write(fd, p, strlen(p)) == -1){perror("write");exit(1);}// 使用 F_GETFL 命令得到文件状态标志flag = fcntl(fd, F_GETFL, 0);if(flag == -1){perror("fcntl");exit(1);}// 将文件状态标志添加 ”追加写“ 选项flag |= O_APPEND; // flag = flag | O_APPEND 这是一个位或运算 注意使用方法!!!// 将文件状态修改为追加写if(fcntl(fd, F_SETFL, flag) == -1){perror("fcntl -- append write");exit(1);}// 再次输入新内容,该内容会追加到旧内容的后面if(write(fd, q, strlen(q)) == -1){perror("write again");exit(1);}// 关闭文件close(fd);return 0;
}