fcntl函数理解问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了fcntl函数理解问题相关的知识,希望对你有一定的参考价值。

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char *argv[])

if (argc < 2)
perror("参数数量过少");


int fd=open(argv[1], O_RDONLY|O_TRUNC);

char *msg="hello";
printf("fd=%d\n",fd);
fcntl(fd, F_SETFL, O_WRONLY|O_TRUNC);
int num=write(fd,msg,strlen(msg)+1);
printf("num=%d\n",num);

return 0;

fcntl 函数不是可以设置文件状态标识吗,那么我以只读方式打开一个文件,使用fcntl将文件状态标识设置为可写,为什么不能写入文件呢?
argv[1] 为文件路径,文件权限为可读写

控制台输出
fd=3
num=-1

参考技术A 估计fcntl返回失败-1,O_WRONLY|O_TRUNC不能更改

fcntl的文件状态有7个:O_RDONLY,O_WRONLY,O_RDWR,O_NONBLOCK,O_APPEND,O_SYNC(异步I/O),O_ASYNC(等待写完成),
可以更改的标志是O_APPEND,O_NONBLOCK,O_SYNC,O_ASYNC。(没有O_EXEC等其他的)
O_NONBLOCK:非阻塞I/O,如果read(2)调用没有可读的数据,或者如果write(2)操作将阻塞,则read或write调用将返回-1和EAGAIN错误。
O_APPEND:强制每次写(write)操作都将添加在文件大的末尾,相当于open(2)的O_APPEND标志。
O_DIRECT:最小化或去掉reading和writing的缓存影响。系统将企图避免缓存你的读或写的数据,如果不能避免缓存,那么它将最小化已经被缓存了的数据造成的影响。如果这个标志用的不够好,将大大降低性能。
O_ASYNC:当I/O可用的时候,允许SIGIO信号发送到进程组,例如:当有数据可读的时候。本回答被提问者采纳

以上是关于fcntl函数理解问题的主要内容,如果未能解决你的问题,请参考以下文章

I/O多路转接之select和非阻塞IO

linux 编程问题 fcntl函数

文件IO——fcntl 函数 和 ioctl 函数

fcntl函数详解

linux中fcntl()函数的使用

fcntl函数