在使用类似于fopen()
的CRT函数后,我可以使用strerror()
获取errno值的文本表示。如果我使用open()
Linux系统调用而不是CRT函数,则在失败时它也会设置errno值。将strerror()
应用于此errno值是否正确?如果不是,是否有一些Linux系统调用与strerror()
相同?
在使用类似于fopen()
的CRT函数后,我可以使用strerror()
获取errno值的文本表示。如果我使用open()
Linux系统调用而不是CRT函数,则在失败时它也会设置errno值。将strerror()
应用于此errno值是否正确?如果不是,是否有一些Linux系统调用与strerror()
相同?
是的,您的代码可能是以下内容(未经测试):
#include <stdio.h>
#include <errno.h>
#include <string.h> // declares: char *strerror(int errnum);
FILE *
my_fopen ( char *path_to_file, char *mode ) {
FILE *fp;
char *errmsg;
if ( fp = fopen( path_to_file, mode )) {
errmsg = strerror( errno ); // fopen( ) failed, fp is set to NULL
printf( "%s %s\n", errmsg, path_to_file );
}
else { // fopen( ) succeeded
...
}
return fp; // return NULL (failed) or open file * on success
}
是的
是的
在 IT 技术中有 perror
if (-1 == open(....))
{
perror("Could not open input file");
exit(255)
}
open()
系统调用实际上是在C库中定义的函数,该函数调用内核的实际 open()
系统调用。
errno 是由C库定义和管理的变量,而不是由内核定义。它在系统调用返回时设置为内核返回的错误代码。open()
在 sysdeps/unix/sysv/linux/open.c 中定义为:int
__libc_open (const char *file, int oflag, ...)
{
int mode = 0;
if (__OPEN_NEEDS_MODE (oflag))
{
va_list arg;
va_start (arg, oflag);
mode = va_arg (arg, int);
va_end (arg);
}
return SYSCALL_CANCEL (openat, AT_FDCWD, file, oflag, mode);
}
libc_hidden_def (__libc_open)
weak_alias (__libc_open, __open)
libc_hidden_weak (__open)
weak_alias (__libc_open, open)
openat()
),并在发生任何错误条件时设置errno的错误代码。
errmsg
这个临时变量没有用处。直接将strerror(errno)
放入printf
函数的参数列表中即可。 - R.. GitHub STOP HELPING ICE