fcntl函数理解问题

author author     2023-03-09     634

关键词:

#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信号发送到进程组,例如:当有数据可读的时候。本回答被提问者采纳

文件io——fcntl函数和ioctl函数(代码片段)

6.1fcntl函数6.1.1函数介绍1#include<unistd.h>2#include<fcntl.h>3intfcntl(intfd,intcmd);4intfcntl(intfd,intcmd,longarg);5intfcntl(intfd,intcmd,structflock*lock);函数说明:fcntl()用来操作文件描述词的一些特性。函数功能:可以改 查看详情

fcntl函数(代码片段)

通过fcntl函数设置文件的阻塞特性设置为阻塞:fcntl(fd,F_SETFL,0);设置为非阻塞:fcntl(fd,F_SETFL,O_NONBLOCK);如果是阻塞,管道中没有数据,read会一直等待,直到有数据才会继续运行,否则一直等待如果是非阻塞&#... 查看详情

第七篇:使用fcntl函数获取,设置文件的状态标志

...,修改这个文件的状态标志呢?本文将告诉你如何用fcntl函数获取指定文件的状态标志。解决思路    1.对于获取文件状态标志,我们可以通过调用fcntl函数得到一个记录文件标志的整型变量,然后分别让它和各个状... 查看详情

linux中fcntl()函数的使用

复制上来,排版就出问题了...见谅请问,我在编写加锁函数的时候,先判断能否加锁,fcntl(fd,F_GETLK,&lock);但是,得到的lock.l_type不是F_RDLCK,F_WRLCK,F_UNLCK中的任何一个,没有加锁的话,就应该是F_UNLCK啊??为什么呢voidlock_set(intfd,int... 查看详情

fcntl和flock两个系统调用的区别

总的来说,flock函数只能锁定整个文件,无法锁定文件的某一区域。而fcntl可以利用structflock结构体,来实现文件里部分区域锁定的操作。附:fcntl(文件描述词操作) 相关函数open,flock表头文件#include<unistd.h>#include<fcnt... 查看详情

使用fcntl在python中锁定文件(代码片段)

我正在尝试定义函数以简化使用fcntl模块锁定文件。当我手动运行fcntl.lockf(lock_file,fcntl.LOCK_EX|fcntl.LOCK_NB)在两个单独的Python实例中,我得到了预期的异常BlockingIOError:[Errno11]Resourcetemporarilyunavailable但是当我在mylock.py中定义函数来自... 查看详情

fcntl()(代码片段)

fcntl系统调用可以用来对已打开的文件描述符进行各种控制操作以改变已打开文件的的各种属性函数原型: #include<unistd.h>#include<fcntl.h>intfcntl(intfd,intcmd);intfcntl(intfd,intcmd,longarg);intfcntl(intfd,intcmd,structflock*lock);fcn 查看详情

写一个dup2功能同样的函数,不能调用fcntl函数,而且要有出错处理

实现的时候用到系统原来的dup函数//mydup2.c//2015/08/17LuciferZhangversion1.0//writemyowndup2function//usedup()functionwheninplementation#include<unistd.h>//includedup()#include<stdio.h>#include<stdlib 查看详情

i/o多路转接之select和非阻塞io(代码片段)

文章目录1.非阻塞IO1-1fcntl1-2实现函数SetNoBlock2.I/O多路转接之select1-1初识select1-2select函数原型1-3理解select执行过程1-4socket就绪条件1-5select的特点1-6select缺点1-7代码链接1.非阻塞IO1-1fcntl一个文件描述符,默认都是阻塞IO.函数原型如下&#... 查看详情

文件锁-fcntlflocklockf(代码片段)

这三个函数的作用都是给文件加锁,那它们有什么区别呢?首先flock和fcntl是系统调用,而lockf是库函数。lockf实际上是fcntl的封装,所以lockf和fcntl的底层实现是一样的,对文件加锁的效果也是一样的。后面分析不同点时大多数情... 查看详情

unix环境高级编程里的fcntl函数使用示例

#include"stdio.h"#include"fcntl.h"#include"unistd.h"intmain(intargc,char*argv[])intval;if(argc!=2)printf("usage:a.out<desriptior#>\n");exit(-1);if((val=fcntl(atoi(argv[1]),F_GETFL,0))<0)printf("fcntlerrorforfd%d\n",atoi(argv[1]));swi... 查看详情

第3章文件i/o_dupdup2fcntl和ioctl函数

5.其它I/O系统调用(1)dup和dup2函数头文件#include<unistd.h> 函数intdup(intoldfd);intdup2(intoldfd,intnewfd);返回值若成功返回新文件描述符,出错返回-1功能文件描述符的复制(将oldfd复制给newfd)参数old:原先的文件描述符newfd:新... 查看详情

调用 fcntl.lockf() 中的管道(“按位或”)

...iseOR")incalltofcntl.lockf()【发布时间】:2019-06-1706:37:16【问题描述】:Thisanswer包含以下行:fcntl.lockf(fp,fcntl.LOCK_EX|fcntl.LOCK_NB)管道,在Python中是"bitwiseOR"我已经检查了fcntl.lockf(fd,cmd 查看详情

fcntl.ioctl() 的 64 位参数

...:64-bitargumentforfcntl.ioctl()【发布时间】:2013-06-2009:54:31【问题描述】:在我的Python(2.7.3)代码中,我尝试使用ioctl调用,接受longint(64位)作为参数。我在64位系统上,所以64位int与指针大小相同。我的问题是Python似乎不接受64位int... 查看详情

深入理解系统调用(代码片段)

...示:       1.应用程序代码调用xyz(),该函数是一个包装系统调用的库函数。  2.库函数xyz()负责准备向内核传递的参数,并触发软中断以切换到内核。  3.CPU被软中断打断后,执行中断处理函数,即系统调用... 查看详情

fcntl.ioctl 在 Python 2 上总是失败

】fcntl.ioctl在Python2上总是失败【英文标题】:fcntl.ioctlalwaysfailsonPython2【发布时间】:2015-09-1021:16:07【问题描述】:以下总是失败:importfcntlimporttermiosbuffer=bytearray(8)fcntl.ioctl(2,termios.TIOCGWINSZ,buffer,True)总是失败:Traceback(mostrecentcalll 查看详情

linux fcntl文件锁定超时

...:linuxfcntlfilelockwithtimeout【发布时间】:2019-11-2414:45:09【问题描述】:标准的linuxfcntl调用不提供超时选项。我正在考虑使用信号实现超时锁定。这里是阻塞锁的描述:F_SETLKW这个命令应该等同于F_SETLK,除了如果共享或排他锁被其... 查看详情

Windows 上的 fcntl 替代品

...题】:fcntlsubstituteonWindows【发布时间】:2010-11-2804:28:05【问题描述】:我收到了一个使用标准库中的fcntl模块的Python项目(如果这很重要,它恰好是一个Django项目),该模块似乎仅在Linux上可用。当我尝试在我的Windows机器上运行... 查看详情