簡體   English   中英

errno、strerror 和 Linux 系統調用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM