功能:根据描述符来获取或设置 操作文件时 的属性
1 #include<stdio.h> 2 #include<unistd.h> 3 #include<fcntl.h> 4 5 int 6 main(void) 7 { 8 int fd0,fd; 9 int flag; 10 if(-1==(fd0 = open("fcntl.c",O_RDONLY))){ 11 printf("open failed\n"); 12 return -1; 13 } 14 15 //复制文件描述符到fd 16 printf("复制文件描述符:\n"); 17 fd = 100; 18 fcntl(fd0,F_DUPFD,fd); 19 close(fd0); 20 21 //获取/设置文件描述符的标志 22 printf("获取文件描述符的标志:\n"); 23 flag = fcntl(fd,F_GETFD); 24 printf("F_GETFD1 : flag = %d\n",flag); 25 fcntl(fd,F_SETFD,flag|FD_CLOEXEC); 26 flag = fcntl(fd,F_GETFD); 27 printf("F_GETFD2 : flag = %d\n",flag); 28 29 //获取设置文件状态标志 , 注意 : 只能改O_APPEND O_NONBLOCK O_SYNC 30 //O_DSYNC O_RSYNC O_FSYNC O_ASYNC 这几个标志 31 printf("获取设置文件状态标志:\n"); 32 flag = fcntl(fd,F_GETFL); 33 printf("F_GETFL1 : stat = %o\n",flag); 34 fcntl(fd,F_SETFL,flag|O_APPEND); 35 flag = fcntl(fd,F_GETFL); 36 printf("F_GETFL2 : stat = %o\n",flag); 37 38 //获取/设置接收 SIGIO 和 SIGURG 信号的进程ID 或 进程组ID 39 //(设置异步I/O所有权)
40 printf("设置异步I/O所有权:\n"); 41 flag = fcntl(fd,F_GETOWN); 42 if(flag >= 0) 43 printf("F_GETOWN1 : own = %d\n",flag); 44 else45 printf("F_GETOWN1 : grp = %d\n",flag); 46 47 fcntl(fd,F_SETOWN,1); 48 49 flag = fcntl(fd,F_GETOWN); 50 if(flag >= 0) 51 printf("F_GETOWN2 : own = %d\n",flag); 52 else53 printf("F_GETOWN2 : grp = %d\n",flag); 54 55 56 57 close(fd); 58 return 0; 59 }
F_GETOWN : 当返回的是进程组ID 的时候 , ID 值为 负值 , 但返回的是进程ID 的时候, 返回的值为 非负值
还有设置文件锁的功能 :
xxxxxxxxxxxxxxxxxxxxxxxxxxxx