open、write等文件读写函数


 write函数原型是size_t write(fd, buf, size);其中fd是文件描述符,也是缓冲区中的东西将要写入的地方,白话一点来说,fd就是一个你将要放东西进去的容器的编号。buf 就是你所要存的东西的来源。size 不用说,大家也知道就是大小啦!

 read函数原型 size_t  read(int fd, void *buf, size_t count);

 参数:   

      fd: 将要读取数据的文件描述词。buf:  所读取到的数据的内存缓冲。 count: 需要读取的数据量。

open 函数比较复杂

函数原型:

 int open(const char *pathname, int oflag, …/*, mode_t mode * / ) ;
 打开的操作类型有如下几种
   1) O_RDONLY 只读打开
   2) O_WRONLY 只写打开
   3) O_RDWR 读、写打开
   4) O_APPEND 每次写时都加到文件的尾端
   5) O_CREAT 若此文件不存在则创建它。使用此选择项时,需同时说明第三个参数mode,用其说明该新文件

的存取许可权位。
   6) O_EXCL 如果同时指定了O_CREAT,而文件已经存在,则出错。这可测试一个文件是否存在,如果不存在

则创建此文件成为一个原子操作。
   7) O_TRUNC 如果此文件存在,而且为只读或只写成功打开,则将其长度截短为0。
   8) O_NOCTTY 如果p a t h n a m e指的是终端设备,则不将此设备分配作为此进程的控制终端。
   9) O_NONBLOCK 如果p a t h n a m e指的是一个F I F O、一个块特殊文件或一个字符特殊文件,则此选择

项为此文件的本次打开操作和后续的I / O操作设置非阻塞方式。
   10)O_SYNC 使每次w r i t e都等到物理I / O操作完成。
   这些控制字都是通过“或”符号分开(|)

 

下面是关于这几个函数的一个简单小程序

#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<stdio.h>
#include<fcntl.h>
#include<stdlib.h>
int main()
{
int fd1,fd2;
char s[10],*buf="";
scanf("%s",s);
fd1=open("/root/hy/k.txt",O_RDWR|O_CREAT);
fd2=open("/root/hy/kk.txt",O_RDWR|O_CREAT);
printf("%d/n",fd1);
write (fd1,s,sizeof(s)) ;
read(fd1,buf,sizeof(s));
puts(buf);
write(fd2,buf,sizeof(s));
close(fd1);
close(fd2);
return 0;
}

### 拦截和修改 Python 中 `open` 函数文件读写行为 要通过 Hook 机制拦截并修改 Python 中 `open` 函数的行为,可以采用 Monkey Patching 技术。这是一种在运行时动态替换函数或方法的方式,非常适合用于修改内置函数的行为。 --- #### 方法:使用 Monkey Patching 修改 `open` 函数 以下是一个完整的示例,展示了如何通过 Hook 实现对 `open` 函数的自定义逻辑: ```python # 备份原始的 open 函数 _original_open = open # 定义新的 open 函数作为 Hook def custom_open(*args, **kwargs): print(f"[Hooked] Intercepted call to 'open' with arguments: {args}, kwargs: {kwargs}") # 可在此处添加自定义逻辑,比如记录日志、验证参数等 # 调用原始的 open 函数 file_object = _original_open(*args, **kwargs) # 返回一个包装后的文件对象以进一步控制读写行为 return CustomFileWrapper(file_object) # 创建一个包装类来控制文件对象的读写行为 class CustomFileWrapper: def __init__(self, file_object): self.file_object = file_object def write(self, content): print(f"[Hooked] Intercepted write operation with content: {content}") # 在此处可以修改写入的内容 modified_content = content.upper() # 示例:将所有写入内容转换为大写 return self.file_object.write(modified_content) def read(self, size=-1): data = self.file_object.read(size) print(f"[Hooked] Intercepted read operation with data: {data}") # 在此处可以修改读取的数据 return data[::-1] # 示例:反转读取的数据 def __getattr__(self, attr): # 将未定义的方法委托给原始文件对象 return getattr(self.file_object, attr) # 替换全局的 open 函数 import builtins builtins.open = custom_open # 测试代码 with open("test.txt", "w+") as f: f.write("hello world\n") # 写入的内容会被转换为大写 f.seek(0) print(f.read()) # 读取的内容会被反转 ``` --- #### 关键点解析 1. **备份原始函数** 在替换 `open` 函数之前,先将其保存到变量 `_original_open` 中,以便后续能够正常调用原始函数[^1]。 2. **自定义逻辑** 在 `custom_open` 函数中,可以在调用原始 `open` 函数前插入任意逻辑,例如打印日志、验证参数等。 3. **包装文件对象** 使用 `CustomFileWrapper` 类包裹原始文件对象,从而能够在文件读写操作中插入额外的逻辑。这样不仅可以控制文件读写行为,还可以保留其他方法(如 `seek`、`close` 等)的正常使用。 4. **恢复默认行为** 如果需要恢复默认的 `open` 函数行为,只需重新赋值即可: ```python import builtins builtins.open = _original_open ``` --- #### 注意事项 - **线程安全问题** 如果程序是多线程的,Monkey Patching 可能会引发竞争条件或其他并发问题。因此,在复杂环境下需格外小心[^1]。 - **性能开销** 添加过多的 Hook 逻辑可能导致性能下降,尤其是在频繁调用 `open` 的情况下。建议仅在必要时启用 Hook,并优化其中的逻辑。 - **兼容性** 此种方法适用于大多数情况下的脚本和小型项目。但对于大型框架或库来说,可能会影响其预期行为,故需慎重考虑[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值