[英]errno, strerror and Linux system calls
在使用 CRT 函數后,我可以使用strerror()
來獲取errno值的文本表示,例如fopen()
。 如果我使用open()
Linux 系統調用而不是 CRT function,它也會在失敗時設置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
}
是
是
在那里是perror
if (-1 == open(....))
{
perror("Could not open input file");
exit(255)
}
大多數 Linux 系統調用被 C 庫例程封裝。 open()
系統調用實際上是 C 庫中定義的 function,它調用 kernel 的實際open()
系統調用。
errno是由 C 庫而不是 kernel 定義和管理的變量。 它在系統調用返回時設置,錯誤代碼由 kernel 返回。
例如,在 GNU 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)
底部的宏在__libc_open()和open()之間建立了等價關系。
SYSCALL_CANCEL()宏調用實際的系統調用(即openat()
)並在發生任何錯誤情況時使用錯誤代碼設置errno 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.