fcntl

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