python系统错误码errno

本文对比了Python和C语言中errno的使用,介绍了Python的errno.errorcode和os.strerror,以及C语言中errno.h的定义。通过实例展示了如何在C语言中捕获并解析错误码,重点展示了两个语言中处理错误类型的相似性和差异性。

文章目录

python

即标准的errno系统符号,与C语言中的errno.h相同,其数字代码所对应的文字描述可通过os.strerror来获取。

>>> for i in np.sort(list(errno.errorcode.keys())):
...   print(i,errno.errorcode[i],os.strerror(i))
...

其输出如下表

1EPERMOperation not permitted
2ENOENTNo such file or directory
3ESRCHNo such process
4EINTRInterrupted function call
5EIOInput/output error
6ENXIONo such device or address
7E2BIGArg list too long
8ENOEXECExec format error
9EBADFBad file descriptor
10ECHILDNo child processes
11EAGAINResource temporarily unavailable
12ENOMEMNot enough space
13EACCESPermission denied
14EFAULTBad address
16EBUSYResource device
17EEXISTFileexists
18EXDEVImproper link
19ENODEVNo such device
20ENOTDIRNot a directory
21EISDIRIs a directory
22EINVALInvalid argument
23ENFILEToo many open files in system
24EMFILEToo many open files
25ENOTTYInappropriate I/O control operation
27EFBIGFile too large
28ENOSPCNo space left on device
29ESPIPEInvalid seek
30EROFSRead-only file system
31EMLINKToo many links
32EPIPEBroken pipe
33EDOMDomain error
34ERANGEResult too large
36EDEADLOCKResource deadlock avoided
38ENAMETOOLONGFilename too long
39ENOLCKNo locks available
40ENOSYSFunction not implemented
41ENOTEMPTYDirectory not empty
42EILSEQIllegal byte sequence
104EBADMSGbad message
105ECANCELEDoperation canceled
111EIDRMidentifier removed
120ENODATAno message available
121ENOLINKno link
122ENOMSGno message
124ENOSRno stream resources
125ENOSTRnot a stream
127ENOTRECOVERABLEstate not recoverable
129ENOTSUPnot supported
132EOVERFLOWvalue too large
133EOWNERDEADowner dead
134EPROTOprotocol error
137ETIMEstream timeout
139ETXTBSYtext file busy

C语言

在C语言中,errno.h定义了整数变量errno,用于表明错误类型,程序启动时,errno为零。其实,Python中对错误码的解读也来自于此。

如果该值不为0,说明发生了错误,操作系统会定义各种错误码所对应的错误类型,例如2表示未找到文件或文件夹等,而错误号所对应的错误类型被封装在string.h中,可通过函数strerror()来搜索。

#include<stdio.h>
#include<errno.h>
#include<string.h>

int main(){
	for(int i=0; i<10; i++)
		printf("%d:%s\n",i,strerror(i));
	return 0;
}

编译运行

>gcc testErr.c
>a.exe
0:No error
1:Operation not permitted
2:No such file or directory
3:No such process
4:Interrupted function call
5:Input/output error
6:No such device or address
7:Arg list too long
8:Exec format error
9:Bad file descriptor

所以我们测试一下,若调用一个不存在的文件或文件夹,其main函数改为

int main(){
	FILE *fp;
	fp = fopen("test.txt","r");
	if (fp==NULL)
		printf("%d:%s",errno, strerror(errno));
	return 0;
}
>gcc errFile.c
>a.exe
2:No such file or directory
### 错误原因分析 在使用 Python 的 `watchdog` 库进行文件系统监控时,遇到 `OSError: [Errno 28] No space left on device` 错误,通常表示磁盘空间不足或达到了某种系统资源限制。该错误不仅可能与物理存储空间有关,还可能与**inode**数量、**文件描述符限制**或**系统监控机制**有关。 #### 1. 磁盘空间不足 最直接的原因是目标监控路径所在的磁盘分区已满,无法继续写入新数据。这种情况常见于日志文件写入、临时文件堆积或监控过程中触发的大量文件操作。 #### 2. inode 耗尽 Linux 文件系统中每个文件和目录都对应一个 inode。当文件数量过多(例如监控的目录中存在大量小文件),即使磁盘空间未满,也可能因 inode 耗尽而导致无法创建新文件[^3]。 #### 3. 文件描述符限制 `watchdog` 在监控目录时会为每个子目录打开一个 inotify 实例,这会消耗文件描述符资源。如果系统设置的文件描述符上限较低(默认通常为 1024),则可能因超出限制而报错[^3]。 #### 4. inotify 资源限制 Linux 的 inotify 机制用于实现文件系统监控,其资源(如最大监控实例数、最大队列长度)受系统限制。若监控的目录层级过深或文件数量过多,可能超出 `inotify` 的默认限制,导致 `OSError` 抛出[^3]。 --- ### 解决方案 #### 1. 检查磁盘空间和 inode 使用情况 使用以下命令检查磁盘空间和 inode 使用情况: ```bash df -h df -i ``` 若发现磁盘空间不足,可清理不必要的文件或扩展分区容量;若 inode 耗尽,可删除不必要的小文件或调整文件系统参数。 #### 2. 增加文件描述符限制 查看当前文件描述符限制: ```bash ulimit -n ``` 临时增加限制(例如设置为 65536): ```bash ulimit -n 65536 ``` 若需永久生效,需修改 `/etc/security/limits.conf` 文件,添加如下内容: ``` * soft nofile 65536 * hard nofile 65536 ``` 并确保 `/etc/pam.d/common-session` 包含: ``` session required pam_limits.so ``` #### 3. 调整 inotify 参数 编辑 `/etc/sysctl.conf` 文件,调整以下参数以提高 inotify 资源上限: ``` fs.inotify.max_user_instances=1024 fs.inotify.max_user_watches=524288 ``` 应用更改: ```bash sysctl -p ``` #### 4. 优化监控范围 避免监控过多子目录或频繁变更的目录。可以设置 `recursive=False` 来限制仅监控顶层目录,减少资源消耗: ```python observer.schedule(event_handler, path, recursive=False) ``` --- ### 示例代码:优化监控策略 ```python from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler import time class MyHandler(FileSystemEventHandler): def on_modified(self, event): print(f'文件被修改: {event.src_path}') if __name__ == "__main__": path = "/mnt/windows_share" event_handler = MyHandler() observer = Observer() observer.schedule(event_handler, path, recursive=False) # 限制监控范围 observer.start() try: while True: time.sleep(1) except KeyboardInterrupt: observer.stop() observer.join() ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微小冷

请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值