当前位置:   article > 正文

《Linux C编程实战》笔记:出错处理

《Linux C编程实战》笔记:出错处理

这一节书上把它放到线程这一章,按理说应该在前面就讲了

头文件errno.h定义了变量errno,它存储了错误发生时的错误码,通过错误码可以得到错误的信息

程序开始执行时,变量errno被初始化为0。很多库函数在执行过程中遇到错误时就会将errno设置为相应的错误码。函数被成功调用时,它们不修改errno的值。因此,当一个函数被成功调用,errno的值可能不为零,它的非零值由前面的函数设置。所以不能根据errno的值来判断一个函数执行是否成功。当函数调用失败时( 函数返回-1或NULL),errno 值才有意义。

示例程序1

以下是一个示例程序,改程序通过打开一个文件,如果由于某种原因文件不能被打开时,就可以得到一个相应的errno值,检查其对应错误码,可以得到错误的原因。

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<errno.h>
  4. int main(){
  5. FILE *stream;
  6. char *filename="test";
  7. errno=0;
  8. stream=fopen(filename,"r");//这个是C语言的文件打开,和之前讲的Linux的不一样,不过效果都是一样的
  9. if(stream==nullptr)
  10. printf("open file %s failed,errno is %d\n",filename,errno);
  11. else printf("open file %s successfully\n",filename);
  12. }

如果是文件不存在的情况下运行,结果如下

 2对应的错误码是ENOENT,然后就知道错误原因是:文件或目录不存在。

错误码

错误码是定义在errno.h中的宏,通常以字母E开头,后面由一串大写字母或数字组成。

以下是一些错误码的宏,当然不可能说全记住,看看就好。

  1. 成功:

    • 宏:0
    • 描述:表示操作成功完成。
  2. 通用错误:

    • 宏:EINVAL
    • 描述:无效的参数。
  3. 文件相关错误:

    • 宏:ENOENT
    • 描述:文件或目录不存在。
    • 宏:EEXIST
    • 描述:文件或目录已存在。
  4. 内存相关错误:

    • 宏:ENOMEM
    • 描述:内存不足。
  5. 权限相关错误:

    • 宏:EACCES
    • 描述:权限不足。
  6. 网络相关错误:

    • 宏:ECONNREFUSED
    • 描述:连接被拒绝。
    • 宏:ETIMEDOUT
    • 描述:操作超时。
  7. 管道和进程相关错误:

    • 宏:EPIPE
    • 描述:管道破裂。
  8. socket 相关错误:

    • 宏:EADDRINUSE
    • 描述:地址已经在使用中。
    • 宏:EADDRNOTAVAIL
    • 描述:地址不可用。
  9. IO 相关错误:

    • 宏:EIO
    • 描述:IO 错误。
  10. 数学库相关错误:

    • 宏:EDOM
    • 描述:域错误。
    • 宏:ERANGE
    • 描述:结果太大,无法表示。
  11. 线程相关错误:

    • 宏:EPERM
    • 描述:操作不允许。
  12. 信号相关错误:

    • 宏:EINTR
    • 描述:被中断的系统调用。

错误的提示信息

出现错误时,可以打印出相应的错误提示信息。

strerror函数

  1. #include<string.h>
  2. char *strerror(int errnum);

这个函数在头文件string.h中声明。它会根据参数errnum提供的错误码获取一个描述错误信息的字符串,函数的返回值为指向该字符串的指针。errnum的值通常就是errno。

perror函数

这个函数我好早之前就介绍过了,《Linux C编程实战》笔记:文件读写-CSDN博客

  1. #include<stdio.h>
  2. void perror(const char *message);

 perror()打印错误信息到stderr, stderr 在Linux中通常就是指屏幕或命令行终端。调用perror()时,
如果参数message是一个空指针,perror 仅仅根据errno打印出对应的错误提示信息。如果提供一
个非空的值,perro会把此message加在其输出信息的前面。perror会添加一个冒号和空格message
和错误信息分开,以便区分。

示例程序2

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<errno.h>
  4. #include<string.h>
  5. FILE *open_file(const char *filename){
  6. FILE *stream;
  7. errno=0;
  8. stream=fopen(filename,"r");
  9. if(stream==nullptr){
  10. printf("can not open the file %s. reason:%s\n",filename,strerror(errno));//用strerror获得错误的信息
  11. exit(-1);
  12. }
  13. else return stream;
  14. }
  15. int main(){
  16. const char *filename="test";
  17. open_file(filename);
  18. return 0;
  19. }

strerror实际上就是通过之前的错误码得到错误码对应的错误信息字符串,然后打印出来。

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
  • 文章浏览阅读2.2k次,点赞98次,收藏98次。expect是由DonLibes基于Tcl(ToolCommandLanguage)语言开发的,是一种脚本语言,主要应用于自动化交互式操作的场景,借助Expect处理交互的命令,可以将交互过程... [详细]

  • 文章浏览阅读1w次,点赞141次,收藏140次。探索LinuxDocker管理神器Portainer,解锁远程访问技巧,轻松图形化管理你的容器。LinuxDocker图形化工具Portainer远程访问文章目录前言1.部署Portainer... [详细]

  • 文章浏览阅读4.6k次,点赞126次,收藏147次。操作系统进程状态,以及Linux中的进程状态,僵尸进程,孤儿进程【Linux】探索Linux进程状态|僵尸进程|孤儿进程最近,我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现... [详细]

  • 文章浏览阅读5.1k次,点赞151次,收藏135次。LinuxAMH服务器管理面板远程访问LinuxAMH服务器管理面板远程访问文章目录1.前言2.Linux安装AMH面板3.本地访问AMH面板4.Linux安装Cpolar5.配置AMH面... [详细]

  • 文章浏览阅读1.1w次,点赞32次,收藏103次。Linux安装MySQL【超详细版】_linux安装mysqllinux安装mysql一、安装MySQL的准备工作1.查看系统版本cat/etc/redhat-release12.查看系统是... [详细]

  • 文章浏览阅读723次。拿到dotnet-sdk-8.0.100-linux-x64.tar.gz文件。1.有些环境比较老的服务器,会出现如下的错误提示,需要更新c++库。执行命令检测是否安装成功,执行dotnet--version。2.把文... [详细]

  • 文章浏览阅读1.6k次,点赞77次,收藏70次。ssh操作需要免密附上本机免密脚本ssh_keygen.sh。执行完脚本成功登录。【Linux】Centos7shell实现MySQL5.7tar一键安装... [详细]

  • 文章浏览阅读987次,点赞43次,收藏32次。使用上面的Cpolarhttps公网地址,在任意设备的浏览器进行访问,即可成功看到我们AMH面板界面,这样一个公网地址且可以远程访问就创建好了,使用了cpolar的公网域名,无需自己购买云服务器... [详细]

  • 文章浏览阅读950次,点赞49次,收藏46次。本篇博客作为Linux常见指令的总结,主要是方便个人进行回顾使用。以上就是我对于Linux常见指令的总结。!!Linux:常见指令个人主页:个人主页个人专栏:《数据结构》《C语言》《C++》文章... [详细]

  • 文章浏览阅读2.8w次,点赞73次,收藏317次。ps命令用来查看系统进程,ps-ef:查看所有进程ps-aux:查看所有进程ps-ef|greptomcat:查看指定进程_psefgrep命令看进程psefgrep命令看进程「作者主页」:... [详细]

  • 文章浏览阅读1.2w次,点赞64次,收藏74次。Crontab是一个在Unix和Linux操作系统上用于定时执行任务的工具。它允许用户创建和管理计划任务,以便在特定的时间间隔或时间点自动运行命令或脚本。Crontab是crontable的缩... [详细]

  • 文章浏览阅读1.1k次,点赞76次,收藏65次。Linux|创建|删除|查看|基本命名详解Linux|创建|删除|查看|基本命名详解Linux|创建|删除|查看|基本命名详解文章目录Linux|创建|删除|查看|基本命名详解前言一、安装Li... [详细]

  • DataEase是开源的数据可视化分析工具,帮助用户快速分析数据并洞察业务趋势,从而实现业务的改进与优化。是开源的数据可视化分析工具,帮助用户快速分析数据并洞察业务趋势,从而实现业务的改进与优化。在本地搭建后,借助cpolar内网穿透实现远... [详细]

  • 介绍socket编程,简单实现一个UDP服务器✨✨【Linux】套接字编程目录套接字IP+PORTTCP和UDP的介绍TCPUDP网络字节序转换接口UDP服务器的编写服务器的初始化 socketbindsockaddr结构服务器的... [详细]

  • 本文是对Linux中文件和目录权限的总结。以上就是我对于Linux中文件和目录权限的总结。!!Linux:权限个人主页:个人主页个人专栏:《数据结构》《C语言》《C++》《Linux》文章目录前言一、Linux权限的管理文件访问者的分类(身... [详细]

  • 看了这篇文章你将学到软硬链接的使用,以及制作自己的动静态库,并使用他们✨✨_动态库的软连接动态库的软连接系列文章收录于【Linux】文件系统 专栏关于文件描述符与文件重定向的相关内容可以移步 文件描述符与重定向操作。可以... [详细]

  • 讲述Linux的基本指令:man、cp、mv、cat、more、less、head、tail等指令。【走进Linux的世界】Linux---基本指令(2)个人主页:平行线也会相交欢迎点赞... [详细]

  • 上一篇文章中我们讲到了很多的网络名词以及相关知识,下面我们就直接进入udp服务器的实现。一、udp服务器的实现cc=g++.PHONY:allclean:我们通过all就可以创建多个可执行程序了,对于cc这个变量我们设置为g++,以后如果想... [详细]

  • Linux防火墙服务和区的不同配置操作,放行端口或服务等_linux防火墙配置linux防火墙配置目录防火墙介绍zones预定义服务firewalld启动与停止查看firewalld当前状态和设置使⽤CLI查看firewalld设置fire... [详细]

  • Linux MeterSphere一站式开源持续测试平台远程访问
    MeterSphere是一站式开源持续测试平台,涵盖测试跟踪、接口测试、UI测试和性能测试等功能,全面兼容JMeter、Selenium等主流开源标准,有效助力开发和测试团队充分利用云弹性进行高度可扩展的自动化测试,加速高质量的软件交付,推... [详细]

相关标签
  

闽ICP备14008679号