#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* arg */ );
功能:fcntl是file control缩写,可通过fcntl设置或者修改一打开文件的某些性质
返回值:
成功:返回值视具体参数而定
失败:返回-1 ,设置错误号
参数:
1)fd:指向打开的文件
2)cmd:控制命令,通过指定不同的宏来修改fd所指向文件的性质
(a) F_DUPFD
复制描述符,可用来模拟dup和dup2
返回值:返回复制后的新文件描述符
(b)F_GETFL,F_SETFL
获取,设置文件状态标志,比如在open时没有指定O_APPEND可以使用fcntl函数来补设
返回值:返回文件的状态标志
(c)F_GETFD,F_SETFD
(d)F_GETOWN,F_SETOWN
(e)F_GETLK,F_SETLK,F_SETLKW
ioctl
根据不同的参数有多种不同的功能
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <errno.h> #include <stdlib.h> #include <string.h> /* fcntl(int fd,int cmd) 返回:成功则依赖于cmd,出错为-1 */ int set_flag(int fd,int flag){ int var = fcntl(fd,F_GETFL); var |=flag; if(fcntl(fd,F_SETFL,var)<0){ return 0; } return 1; } int main(int argc,char *argv[]){ int fd=0; fd=open("./file.txt",O_RDWR|O_TRUNC); if(-1 == fd){ perror("open err"); return 0; } // close(1); // dup(fd); /*模拟dup*/ // close(1); // fcntl(fd,F_DUPFD,0); //0表示不用第三个参数 //模拟dup2 // close(1); // fcntl(fd,F_DUPFD,1); int fd1=open("./file.txt",O_RDWR|O_TRUNC); int flag=0; flag=fcntl(fd,F_GETFL,0); printf("flag=%d\n",flag); flag=flag|O_APPEND; //设置后不再覆盖 fcntl(fd,F_SETFL,flag); fcntl(fd1,F_SETFL,flag); while(1){ write(fd,"php\n",4); sleep(1); write(fd1,"js\n",3); } return 0; }