定位Linux下写句柄错误问题

发布时间:2024年01月16日

编写代码时发现对于以下can 写资源句柄时出现的错误不是很能分析,但是如果将错误码打印出来后,清晰了很多,并且还可以查看。

int Can::Write(const struct can_frame *send_frame)
{ 
  int result;
  std::cout << "before write s_ :" << s_  << std::endl;
  // write
  try{
    result = write(s_, send_frame, sizeof(*send_frame));
    if (result < 0)
    {
      std::cerr <<"Error writing to CAN socket: " << strerror(errno) << std::endl;
      std::cout << "Data size: " << sizeof(*send_frame) << std::endl;
      std::cout << "Socket descriptor: " << s_ << std::endl;
      std::cout << "write result: " << result << std::endl;
      // 错误类型: ENETDOWN
      // 说明: can 接口已关闭
      // 复现方法: 直接手动关闭can, command: sudo ip link set can0 down
      // 目前这种错误不能恢复
      
      // 错误类型: Bad file descriptor
      // 说明: 无效的文件描述符
      // 复现方法:程序中close socket can
      if (errno == EBADF) {
        // CAN 接口已关闭
        cout << "can socket closed" << endl;
        if(reconnectionsTimes <= Setting::MaxCanReconnections)
        {
          if(!ReinitializeCanBus())
          {
            ++reconnectionsTimes;
            std::cerr << "Failed to reinitialize CAN bus, reconnectionsTimes: " << reconnectionsTimes << std::endl;
            return result;
          }else
          {
            cout << "reinitialize CAN bus success! " << endl;
            reconnectionsTimes = 0;
          }
        }
      }
    }
  }catch(std::exception& e)
  {
     std::cout << "Can write error: " << e.what() << std::endl;
  }
  return result;
}

定位Linux下写句柄错误问题
我开发机上错误码对应的位置在如下所述位置。
在这里插入图片描述

文章来源:https://blog.csdn.net/bjydlcq/article/details/135625051
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。