LinuxC语言头里面的ERROR函数怎么使用

LinuxC语言头里面的ERROR函数怎么使用,第1张

errno会返回一个数字,每个数字代表一个错误类型。详细的可以查看头文件。/usr/include/asm/errno.h

如何把errno的数字转换成相应的文字说明?

方式一:可以使用strerrno函数

char

*strerror(int

errno)

使用方式如下:

fprintf(stderr,"error

in

CreateProcess

%s,

Process

ID

%d

",strerror(errno),processID)

将错误代码转换为字符串错误信息,可以将该字符串和其它的信息组合输出到用户界面。

注:假设processID是一个已经获取了的整形ID

方式二:使用perror函数

void

perror(const

char

*s)

函数说明

perror

(

)用来将上一个函数发生错误的原因输出到标准错误(stderr),参数s

所指的字符串会先打印出,后面再加上错误原因

字符串。此错误原因依照全局变量

errno

的值来决定要输出的字符串。

另外并不是所有的c函数调用发生的错误信息都会修改errno。例如gethostbyname函数。

errno是否是线程安全的?

errno是支持线程安全的,而且,一般而言,编译器会自动保证errno的安全性。

我们看下相关头文件

/usr/include/bits/errno.h

会看到如下内容:

#

if

!defined

_LIBC

||

defined

_LIBC_REENTRANT

/*

When

using

threads,

errno

is

a

per-thread

value.

*/

#

define

errno

(*__errno_location

())

#

endif

#

endif

/*

!__ASSEMBLER__

*/

#endif

/*

_ERRNO_H

*/

也就是说,在没有定义__LIBC或者定义_LIBC_REENTRANT的时候,errno是多线程/进程安全的。

为了检测一下你编译器是否定义上述变量,不妨使用下面一个简单程序。

#include

<stdio.h>

#include

<errno.h>

int

main(

void

)

{

#ifndef

__ASSEMBLER__

printf(

"Undefine

__ASSEMBLER__/n"

)

#else

printf(

"define

__ASSEMBLER__/n"

)

#endif

#ifndef

__LIBC

printf(

"Undefine

__LIBC/n"

)

#else

printf(

"define

__LIBC/n"

)

#endif

#ifndef

_LIBC_REENTRANT

printf(

"Undefine

_LIBC_REENTRANT/n"

)

#else

printf(

"define

_LIBC_REENTRANT/n"

)

#endif

return

0

}

你没有权限。重复报错的指令,在前面加上sudo。如果没有sudo的,去编辑修改visudo。不同linux发行版修改方法有些许差异。百度一下 输入像“ubuntu sudo”、”debian sudo“前面是具体发行版,后面是sudo。看看给出的文档。照着做。把sudo给加上。然后再来执行。

首先确定这个文件有可执行权限(目前看起来应该是有的),但是有可执行权限的文件并不一定要直接执行,没准是被其他脚本调用。

ls -l webs

file webs, 确定是个什么样的文件类型。

vi或者cat webs,检查第一行。这里的提示已经很明确的指出第一行有语法错误。接着只需要根据脚本或者文件类型,检查并更正语法错误即可。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7123608.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-01
下一篇2023-04-01

发表评论

登录后才能评论

评论列表(0条)

    保存