
如何把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,检查第一行。这里的提示已经很明确的指出第一行有语法错误。接着只需要根据脚本或者文件类型,检查并更正语法错误即可。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)