errno、strerror和Linux系统调用

5

在使用类似于fopen()的CRT函数后,我可以使用strerror()获取errno值的文本表示。如果我使用open() Linux系统调用而不是CRT函数,则在失败时它也会设置errno值。将strerror()应用于此errno值是否正确?如果不是,是否有一些Linux系统调用与strerror()相同?

3个回答

5
是的,您的代码可能是以下内容(未经测试):

是的,您的代码可能是以下内容(未经测试):

   #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
   }

4
errmsg 这个临时变量没有用处。直接将 strerror(errno) 放入 printf 函数的参数列表中即可。 - R.. GitHub STOP HELPING ICE

2

是的

是的

在 IT 技术中有 perror

if (-1 == open(....))
{
    perror("Could not open input file");
    exit(255)
}

0
大多数Linux系统调用都由C库例程封装。 open() 系统调用实际上是在C库中定义的函数,该函数调用内核的实际 open() 系统调用。 errno 是由C库定义和管理的变量,而不是由内核定义。它在系统调用返回时设置为内核返回的错误代码。
例如,在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的错误代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接