[Linux][2011-11-5] error 宏 linux socket

本文详细解释了Linux系统中常见的错误代码及其含义,帮助开发者更好地理解和处理程序中的异常。
所有的错误代码都在头文见“errno.h”中定义,它们所有的展开以后都是整数常量。这里的有些错误在GNU的系统中不会发生,但是在其他系统中使用GNU库的时候会出现。



宏: int EPERM

操作不被允许;只有文件(或其他资源)或进程的主人才能有特权作这个操作。



宏: int ENOENT


没有这样的文件或目录。这是一个普通文件上的“文件不存在”错误,文件不在提到的目录表中。



宏: int ESRCH


没有进程符合指定的进程号。



宏: int EINTR

函数调用中断;一个异步信号出现而且阻止调用的执行。当出现这样的情况时,你必须试着重新调用。

你可以选择一个函数来在处理完信号以后恢复,这样比出现RINTR的失败要好,《简单的信号中断》。



宏: int EIO


输入输出错误;通常是物理的读写错。



宏: int ENXIO

没有这样的设备或地址。通常,这意味着一个文件描述的设备并没有正确安装,系统不能为它找到正确的设备驱动程序。



宏: int E2BIG

参数列表太长;当使用exec函数中的某一个执行新程序时传递的参数占用了太多的内存空间。这种情况不会出现在GNU的系统中。



宏: int ENOEXEC

无效的可执行文件格式。这种情况由exec函数检测出来;《执行一个文件


宏: int EBADF


错误的文件描述符;比如说,在一个已经关闭的文件描述符上作IO操作或读取一个写打开的描述符(反之亦然)。



宏: int ECHILD

没有子进程。这个错误出现在想要作操纵子进程的操作的时候,已经没有任何可以操纵的子进程了。



宏: int EDEADLK

死锁避免;分配系统资源的时候将可能导致死锁的情况,比如说,参见《文件锁定



宏: int ENOMEM


没有可用的内存。系统不能分配更多的虚拟内存因为它的容量已经满了。



宏: int EACCES

许可权被封锁;文件的许可权不允许所尝试的操作。



宏: int EFAULT


错误地址;检测到一个无效指针。



宏: int ENOTBLK


给出的这种方式需要块特殊文件而这个文件不是。比如说:试图把一个普通文件当文件系统挂在unix系统中将出现这个错误。



宏: int EBUSY


资源忙;一个正在使用的系统资源不能被共享。比如说,你需要删除的文件是一个挂在系统中的文件系统,你将得到这个错误。



宏: int EEXIST


文件已存在;应该对新文件操作的时候这个文件已经明确存在于目录表中。



宏: int EXDEV


尝试跨文件系统作文件链接。



宏: int ENODEV


在需要进去日指明设备类别的函数中给出了错误的设备类型。



宏: int ENOTDIR

在只能处理目录的时候给出的是文件而不是目录。



宏: int EISDIR


是一个目录文件;尝试打开一个目录文件来作写操作时就会发生这个错误。



宏: int EINVAL


无效的参数。用来指出传递给库函数参数时候的各种问题。



宏: int ENFILE

整个系统中打开了太多不同的文件。注意许多连结通道都会被计算成一个打开的文件;参见《连结通道



宏: int EMFILE

当前进程已经打开了太多文件而且不能再打开了。



宏: int ENOTTY


不适当的IO控制操作,比如说在一个普通文件上试图设置终端模式。



宏: int ETXTBSY

一个打算运行的文件当前正被写打开,或要写打开的文件当前正在运行。(这个名字象征着“文本文件忙”。)在GNU的系统中这不是一个错误;可能的情况下文本文件将被复制。



宏: int EFBIG


文件太大。文件的大小超过了系统的允许。



宏: int ENOSPC


设备上没有空间;因为磁盘满而造成写操作失败。



宏: int ESPIPE

错误的查找操作(比如在管道中)。



宏: int EROFS


在一个只读的文件系统中试图修改一个文件。



宏: int EMLINK


太多的连接;单个文件的连结数太大。



宏: int EPIPE

断掉的管道;在管道的另一边没有进程来读取。所有库函数在返回这个错误代码的时候都会产生一个SIGPIPE信号;如果不处理或阻止的话这个信号将终止程序。如此,要是不处理或阻止SIGPIPE的话你的程序实际上看不到EPIPE。



宏: int EDOM


域错误;当数学函数得到的参数值不在函数允许范围内的时候出现这个错误。



宏: int ERANGE


范围错误;当数学函数的结果因上溢或下溢而无法描述的时候出现此错误。



宏: int EAGAIN


资源零是不可用;如果你稍候在作此调用或许会成功。只有fork会因为这个原因返回EAGAIN错误码。



宏: int EWOULDBLOCK


在一个非块格式的目标上作需要块的操作。

兼容性提示:在4.4BSD和GNU中,EWOULDBLOCK和EAGAIN是一样的。早期版本的BSD(参见《伯克利UNIX》)使用两个不同的代码,用EWOULDBLOCK来表示需要块的操作,而EAGAIN表示其他种类的错误。


 



宏: int EINPROGRESS


在一个选择为非块型的目标上的初始化操作不能立即完成。



宏: int EALREADY


在一个选择为非块型的目标上的一个操作正在进行。



宏: int ENOTSOCK


当需要一个套接字的时候指定的文件不是套接字。



宏: int EDESTADDRREQ


在套接字操作中没有指定目标地址。



宏: int EMSGSIZE


送往套接字的消息的大小操作的支持的最大尺寸。



宏: int EPROTOTYPE


所要求的通信协议不支持套接字的种类。



宏: int ENOPROTOOPT


你指定的套接字操作不能被使用的套接字的协议所识别,参见《套接字操作



宏: int EPROTONOSUPPORT


套接字域不支持请求的通信协议。参见《创建一个套接字



宏: int ESOCKTNOSUPPORT


套接字类型不被支持。



宏: int EOPNOTSUPP

你请求的操作不被支持。一些套接字函数不被所有类型的套接字识别,而且有些不能在所有的通信协议上实现。



宏: int EPFNOSUPPORT

你请求的套接字协议组不被支持。



宏: int EAFNOSUPPORT


一个套接字指定的地址组不被支持;它和套接字使用的协议不一致。参见《套接字



宏: int EADDRINUSE

请求的套接字地址正在使用。参见《套接字地址



宏: int EADDRNOTAVAIL


请求的套接字地址已经不可用;比如说,你试着把一个和本机名字不一样的名字给套接字。参见《套接字地址



宏: int ENETDOWN


由于网络不通造成一个套接字操作失败。



宏: int ENETUNREACH


由于子网上的远程主机不可到达造成一个套接字操作失败。



宏: int ENETRESET


由于远程主机崩溃导致网络连接复位。



宏: int ECONNABORTED


一个网络连接被本地中断。



宏: int ECONNRESET


由于外界控制本地主机的原因造成一个网络连接关闭。比如远程的重启动。



宏: int ENOBUFS


IO操作的内核缓冲区都在使用。



宏: int EISCONN

你试图连接一个已经连接了的套接字。参见《创建一个连接》。



宏: int ENOTCONN


套接字没有连接任何东西。你得到这个错误的原因是你试图通过一个套接字传送数据,但是却没有先指定数据的目标。



宏: int ESHUTDOWN


套接字已经被关闭。



宏: int ETIMEDOUT


套接字操作在指定的超时时间间隔内没有收到回音。



宏: int ECONNREFUSED

远程主机拒绝建立网络连接。(通常是因为它并不运行请求的这种服务)



宏: int ELOOP


在查找文件名的时候遇到了许多指向它的符号连接。这个通常用来指出一个符号连接的环路。



宏: int ENAMETOOLONG

文件名太长(比PATH_MAX还要长;参见《文件系统容量限制》)货主机名字太长(在gethostname或sethostname中;参见《主机身份


 



宏: int EHOSTDOWN


请求网络连接的远程主机停机。



宏: int EHOSTUNREACH


请求网络连接的远程主机不可到达。



宏: int ENOTEMPTY

在需要空目录的时候目录非空。通常这个错误出现在你准备删除一个目录的时候。



宏: int EUSERS


文件配额系统由于太多用户而拒绝。



宏: int EDQUOT


用户的磁盘限额已经超过。



宏: int ESTALE

过期的NFS文件句柄。这里只是了NFS系统的内部混乱而且需要对服务器主机的文件系统重新整理。修理这种问题通常需要在本地主机上卸下再重新挂上此NFS文件系统。



宏: int EREMOTE


一个使用文件名来通过NFS加载远程文件系统的时候此文件名已经指定给一个加载好的文件了。(这只是在某些操作系统上的错误,但是我们希望在GNU系统上能运行正常,使这个错误代码不可能实现)



宏: int ENOLCK


没有可用的锁定。由文件锁定功能使用;参见《文件锁


 



宏: int ENOSYS

功能没有实现。一些功能包括命令和选项的定义可能没有被所有的实现所支持,也就是你请求这些没有被支持的功能的时候你会得到这一类的错误。



宏: int ED


有经验的用户将知道错误是什么。



宏: int EGRATUITOUS

这个错误信息没有用处。

Linux Socket CAN应用程序中,避免CAN总线进入ERROR-PASSIVE状态的关键在于正确管理和优化网络通信行为,同时确保系统资源的合理使用。以下是一些可行的方法: 1. **设置适当的接收缓冲区大小** 通过增加Socket的接收缓冲区大小,可以减少由于数据包丢失或处理延迟而导致的错误。这可以通过`setsockopt()`函数设置`SO_RCVBUF`选项实现。如果缓冲区过小,可能导致帧丢弃,从而引发错误计数增加[^1]。 2. **启用CAN FD帧支持以提高效率** 使用`struct canfd_frame`作为基础数据结构,并尝试启用`CAN_RAW_FD_FRAMES`选项来支持CAN FD(Flexible Data-rate)帧传输。这种方式允许更高的数据速率和更大的数据负载,从而减少通信压力并降低错误率[^1]。 3. **合理配置错误帧处理机制** 在Socket CAN中,可以通过`CAN_RAW_ERR_FILTER`选项过滤特定类型的错误帧,仅关注关键错误事件。这样可以减少不必要的中断和处理负担,防止错误计数异常上升[^1]。 4. **避免忙等待和长关中断操作** 如果在底层驱动或应用逻辑中涉及共享数据结构的操作,应避免长时间禁用中断或使用忙等待机制。长时间关闭中断可能会影响实时性并导致数据结构损坏,从而引发错误计数增加。对于软件层面的互斥控制,建议采用更高效的同步机制,如自旋锁(spinlock)或信号量(semaphore),而不是简单的忙等待[^2]。 5. **监控总线状态并动态调整行为** 应用程序可以定期读取CAN控制器的状态寄存器(例如通过`ioctl`获取`CAN_STATE`信息),以判断当前总线是否接近错误被动状态。如果检测到错误计数较高,可以采取措施如降低发送频率、重置连接或通知用户干预。 6. **优化发送队列与流量控制** 控制发送速率,避免突发大量帧导致总线拥塞。可以使用`SO_TXTIME`选项进行精确的时间触发发送,或者利用QoS策略对流量进行整形,确保不会超出总线的处理能力。 7. **使用硬件级错误恢复机制** 确保使用的CAN控制器支持自动恢复机制(如BERR(Bit Error Reporting)、自动重新连接等)。某些控制器可以在检测到严重错误后自动复位或切换到安全模式,从而避免进入ERROR-PASSIVE状态。 ### 示例:设置CAN FD帧支持 ```c int enable_can_fd = 1; if (setsockopt(sock, SOL_CAN_RAW, CAN_RAW_FD_FRAMES, &enable_can_fd, sizeof(enable_can_fd)) < 0) { perror("Failed to enable CAN FD support"); close(sock); exit(EXIT_FAILURE); } ``` ### 示例:设置错误帧过滤 ```c unsigned long err_mask = CAN_ERR_MASK; if (setsockopt(sock, SOL_CAN_RAW, CAN_RAW_ERR_FILTER, &err_mask, sizeof(err_mask)) < 0) { perror("Error setting error filter"); close(sock); exit(EXIT_FAILURE); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值