#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;
}
?