C/C++ Linux 出错处理函数(strerror 与 perror)

对于Linux中errno使用的问题  最近在网络编程使用的过程中,发现errno会经常使用。因此决定在此做个留用,以备以后使用。。。 虽然errno是非线程安全的,但是可以通过几种机制保证其安全。。 最近在使用的过程中获得了errno,程序无法执行,也不知道如何解决问题。因此,理解每一个返回的errno整数值的含义是很重要的。。这个我们可以通过strerror函数来实现。。 strerror(返回整数errno对 阅读详情

我们知道,系统函数调用不能保证每次都成功,必须进行出错处理,这样一方面可以保证程序逻辑正常,另一方面可以迅速得到故障信息。

有两种方式:

1. strerror - 需要将错误信息输出到日志;

2. perror - 不需要将错误信息输出到日志。


一、strerror 

#include <errno.h>

#include <string.h>

char * strerror (int errnum);     /* See NOTES */

errnum:

    传入参数,错误编号的值,一般取 errno 的值;

返回值:

    错误原因;

作用:

调用任何系统函数,当出错后,系统都会将错误代号赋值给全局变量errno,当出现错误后,我们就可以使用函数strerror,传参errno,就会返回对应的出错信息了。

具体使用案例:

fprintf(stderr, "error, reason: %s\n", strerror(errno));

为什么说,需要将错误信息输出到日志文件时要使用strerror函数呢,因为strerror函数转换后返回char *指针,我们拿到这个指针后就可以将这个指针字符串写入日志文件中去啦。

下面会讲解为什么使用perno函数就不可以这样操作!

例:

1. 打开文件失败

#include <errno.h>         // errno
#include <string.h>        // strerror
#include <stdio.h>         // printf
#include <stdlib.h>        // exit

int main (int argc, char *argv[]) {

    FILE *fp = NULL;
    fp = fopen("./123/test.txt", "r");
    if (NULL == fp) {
        char *err = strerror(errno);
        fprintf(stderr, "open file error, reason: %s\n", err);
        //fprintf(stderr, "open file error, reason: %s\n", strerror(errno));
        exit(-1);
    }

    printf("open file success!\n");

    return 0;
}

编译运行:

root@YGT:/home/ygt/echo_server/test# gcc errno.c -o errno
root@YGT:/home/ygt/echo_server/test# ./errno
open file error, reason: No such file or directory

其中,“No such file or directory” 就是我们通过strerror函数获取到的错误信息! 

2. 创建socket失败

#include <stdio.h>         // printf
#include <sys/types.h>     // socket
#include <sys/socket.h>    // socket
#include <stdlib.h>        // exit
#include <errno.h>         // errno
#include <string.h>        // strerror

int main (int argc, char *argv[]) {

    int sock = 0;

    sock = socket(-1, SOCK_STREAM, 0);
    if (-1 == sock) {
        fprintf(stderr, "create socket error, reason: %s\n", strerror(errno));
        exit(-1);
    }

    return 0;
}

编译运行:

root@YGT:/home/ygt/echo_server/test# gcc errno.c -o errno
root@YGT:/home/ygt/echo_server/test# ./errno
create socket error, reason: Address family not supported by protocol

其中,“Address family not supported by protocol” 就是我们通过strerror函数获取到的错误信息! 


二、perror

#include <stdio.h>

#include <errno.h>

void perror (const char *s);    /* See NOTES */

s:

    传入参数,自定义的描述;

返回值:

    无;

作用:

向标准出错stderr 输出错原因 。

具体使用案例:

perror("create socket error ");

将需要提示的字符串传参给perror函数即可,它相当于:

fprintf(stderr, "create socket error : ", strerror(errno));

perror是直接向出错标准stderr输出错误原因!

例:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

int main (int argc, char *argv[]) {

    int sock = 0;

    sock = socket(-1, SOCK_STREAM, 0);
    if (-1 == sock) {
        perror("create socket error ");
        exit(-1);
    }

    return 0;
}

编译运行:

root@YGT:/home/ygt/echo_server/test# gcc errno.c -o errno
root@YGT:/home/ygt/echo_server/test# ./errno
create socket error : Address family not supported by protocol

其中,“Address family not supported by protocol” 就是我们通过perror函数输出的错误信息! 

因为他是直接向出错标准stderr输出错误原因,我们没法通过它获得错误信息字符串,所以也就没法将其写入日志文件中!


最后,调用系统的任何函数,当出现了错误,都可以使用以上两种方式进行打印输出错误信息,从而更轻易的帮助我们找出对应问题!

如果需要将错误信息输出到日志文件,使用strerror 函数;否则可以使用perror函数。

注意:以上介绍的 适用于任何Linux函数,例如open、write等。

完!

第三篇:errno.h快速入门 头文件errno.h定义了一个全局的宏errno,它被展开为一个int类型的“左值”,这意味着宏errno不一定是个对象的标识符,也可以展开为一个由函数返回的可以修改的“左值”,比如int *errno(),这个后面会讲,你可以暂且把它理解为一个全局的int型变量(虽然这样理解是错的,不过方便理解)。 阅读详情

相关推荐

《strstr()、strtok()、strerror()》函数讲解,全网最细干货!

本文章主要详细的介绍了三个函数的操作及注意事项

Shine0115的博客 3146

【C库函数】strerror函数详解

详解strerror库函数

威威的博客 4240

【G4基础08】GPS-2-Macro Commands宏命令

GPS-2

adelall的博客 3738

strerror函数详解 看这一篇就够了-C语言(函数讲解、 使用用法举例、作用)

strerror()函数用于:获取指向错误消息字符串的指针

kim的博客 1万+

一文学会Inner-MPDIoU:YOLOv11边界框回归优化全解析

Inner-MPDIoU 凭借“辅助边框+最小点距离”的双重创新,成功解决了传统 IoU 损失在小目标、遮挡场景、位置偏差场景下的收敛和判别难题,为 YOLOv11 注入了更强的边框回归能力。从原理剖析到代码集成,本教程已为你铺就了一条“定位精度跃升”的实战路径。现在,不妨亲自上手尝试,让你的目标检测模型在各类数据集上都能交出一份“定位精准”的答卷——相信我,当你看到检测框完美贴合目标的那一刻,你会明白这份尝试的价值。我很乐意在你实践过程中帮你解决任何问题,让我们一起推动目标检测在边框回归领域的边界。

know_F0727的博客 140

CesiumForUnreal实现地形等高线效果

CesiumForUnreal实现地形等高线效果

专注GIS开发 3437

Linux服务器 - Socket编程函数_出错处理函数

Socket编程函数 出错处理函数 我们知道,系统函数调用不能保证每次都成功,必须进行出错处理,这样一方面可以保证程序逻辑正常,另一方面可以迅速得到故障信息。 出错处理函数 #include <errno.h> #include <string.h> char strerror(int errnum); / See NOTES */ errnum: 传入参数,错误编号的值,一般取 errno 的值 返回值: 错误原因 =============================

weifc-wei 的博客 391

【WRF数据准备】气象驱动数据-ERA5再分析数据(Copernicus)

【WRF数据准备】气象驱动数据-ERA5再分析数据

WW、forever的博客 5522

strerror函数

strerror函数

qq_43359615的博客 3540

使用ESP32设计嵌入式蓝牙游戏手柄

通过使用ESP32开发板和相关的库,我们可以设计和实现嵌入式蓝牙游戏手柄。连接到该设备后,您可以使用控制器模块的按钮和摇杆等元件来模拟游戏手柄的输入。根据您使用的具体模块和引脚分配,连接按钮和摇杆等控制元件到ESP32的GPIO引脚。ESP32是一款功能强大的微控制器,集成了Wi-Fi和蓝牙功能,非常适合用于开发物联网和嵌入式应用。请注意,本文仅提供了一个基于ESP32的嵌入式蓝牙游戏手柄设计示例,具体实现可能因硬件和需求而有所不同。确保开发板正确连接到计算机,并选择正确的开发板和端口。

CodeMaven的博客 1642

新手福利!大龙虾OpenClaw可视化管理工具来了!告别命令行,这个可视化工具让OpenClaw管理变得超简单

还在用命令行管理OpenClaw?🚀 这个跨平台可视化工具支持14+AI模型,一键切换,还能对接微信飞书钉钉等8大消息渠道,让AI助手管理变得简单直观 ✅ 暗色主题护眼舒适,Rust后端高性能低占用,新手也能轻松上手 🎯

XiaoqiangClub的博客 760

errno 和 strerror函数

到这里我们已经知道函数 strerror() 是怎么实现的了,而且也知道函数使用方法也是对的,但为什么会出现 Segmentation fault 呢?原因是没包含头文件,导致 strerror() 函数变成隐式声明了,而隐式声明的函数它的默认返回值是 int 类型(没找到C语言关于这点的说明文档,有同学知道的话烦告知一下),所以用 %s 打印 int 类型导致 segmentation fault 了。搞得我还去看了源码,顺便学习了一下 errno,原因后面再讲到。

tianyexing2008的博客 767

直方图均衡化原理及matlab和opencv实现代码

详细分析了直方图均衡化的数学原理,配有matlab和opencv实现代码

qq_21603315的博客 4777

strerror(errno)函数

strerror(errno) 打印错误报告 函数

木易C++程序员 2028

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

strerror(errno)错误信息报告

strerror(errno)错误信息报告

zrk8008的博客 483

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

strerror函数详解之【错误码探秘】

详细介绍了strerror函数的使用方法及注意事项

天行健、君子以自强不息 2660

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

c++编程之perror()

定义函数 void perror(const char *s); perror ("open_port"); 函数说明 perror( ) 用来将上一个函数发生错误的原因输出到标准设备(stderr)。参数 s 所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量errno 的值来决定要输出的字符串。 在库函数中有个errno变量,每个...

kangshuangzhu的博客 2115

C语言错误提示函数:strerror和errno

C语言错误提示函数:strerror和errno

m0_61629312的博客 929

strerror():返回一个指向错误字符串的指针

1,头文件: #include <string.h> #include <errno.h> 2,函数的声明: char *strerror(int errnum) 3,参数: errnum -- 错误号,通常是 errno。 4,返回值: 该函数返回一个指向错误字符串的指针,该错误字符串描述了错误 errnum。 5,事例: #include <stdio.h> #include <string.h> #include <errno.h>

lj19990824的博客 714

C语言字符串函数strerror的详细解释

上面的程序中,我们尝试打开一个不存在的文件,open() 函数返回 -1,表示出错。我们可以使用 strerror() 函数将 errno 变量的值转换为相应的错误消息字符串,并输出错误信息。我们可以使用 strerror() 函数将这些错误码转换为相应的错误消息字符串,以便进行错误处理或者输出错误信息。函数会将该错误码转换为相应的错误消息字符串,并返回一个指向该字符串的指针。在C语言中,strerror()函数是一个字符串处理函数,它用于将错误码转换为相应的错误消息字符串。

nnnggglo的博客 1246

嵌入式Linux:strerror函数和perror函数

strerror函数和perror函数是C标准库中的两个函数,用于处理和显示错误信息。它们帮助程序员在程序运行过程中了解并诊断错误原因。

不脱发的程序猿 922

linux下的strerror和perror处理错误函数

`strerror`函数用于将错误码转换为对应的错误消息字符串。它接受一个整数参数,通常是由系统调用或库函数返回的错误码,然后返回一个描述该错误的字符串。errno`全局变量一起使用。它会将错误消息字符串与自定义的错误描述一起输出到标准错误输出(stderr)。这些函数提供了一种方便的方式来处理和显示错误消息,有助于诊断和调试程序中的错误情况。是C语言中用于处理错误信息的函数。

最后一个bug的博客 972

Linux 应用编程之strerror函数

linux 下多点电容触摸驱动的编写框架和步骤。需要用到以下知识点和框架。 ①、多点电容触摸芯片的接口,一般都为 I2C 接口,因此驱动主框架肯定是 I2C。 ②、linux 里面一般都是通过中断来上报触摸点坐标信息,因此需要用到中断框架。 ③、多点电容触摸属于 input 子系统,因此还要用到 input 子系统框架。 ④、在中断处理程序中按照 linux 的 MT 协议上报坐标信息。 多点电容触摸驱动编写框架以及步骤如下: 1、I2C 驱动框架 驱动总体采用 I2C..

shengnan89的博客 1114

C++perror函数

perror 作用:将上一个函数发生的错误原因,输出到标准设备. C++中的errno变量,是用来记录错误类型。当调用,某些函数出错时,会自动设置errno的值。此时,可以利用perror,将errno错误输出。 代码 // 头文件 #include &amp;lt;stdio.h&amp;gt; /* 函数原型 * 参数str,指定要输出的字符串 * 如 perror(&quot;Error:&quot;) * 输...

林多 5419

【C语言】strerror函数和malloc函数

我的第一门语言就是C,但是学艺不精,中途跑去学了C#和Java后,感觉到了C的重要性,毕竟是最接近底层的语言,又跑回来学C。毕竟前两门的控制语句,变量什么的都是类似的,回到C后只需要学习一些特定C的语法,比如宏,预编译指令等等,这些对我来说都是陌生的词汇。前来记录一下陌生的东西。

https://blog.youkuaiyun.com/qFAFAF 957
上一篇: QT 使用第三方库QtXlsx操作Excel表
下一篇: Linux (open、write、read、close、lseek、chmod、sync)操作文件的函数详解
cpp_learners
博客等级 码龄7年 1526粉丝 274原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

cpp_learners

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值