システムコール時間の測定

システムコール時間の測定

システム関数write()とread()(-sコマンドを使用している場合)またはCライブラリ関数(-lを使用しない場合)を使用してデータコピーループを実装しました。システムコール機能の時間を測定しようとしても機能しません。システムコールが静的にリンクされているので、これは正常ですか?これは私のコードです。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>

static const char progname[] = "scat";

static int lcat(){
   int c;
   while (1) {
      if ((c = getc(stdin)) != EOF){
         int n = putc(c, stdout);
         if (n == EOF){
            perror(progname);
            return -1;
         }
      }else{
         perror(progname);
         return -1;
      }
   }

   if (fflush(stdout) || ferror(stdout) || ferror(stdin)) {
      perror(progname);
      return -1;
   }

   return 0;
}

static int scat(){
   int c;
   ssize_t n;

   while (1){
      n = read(0, &c, 1);
      if (n < 0){
         perror(progname);
         return -1;
      }
      int m = write(STDOUT_FILENO, &c, 1);
      if (m == -1 || m != 1){
         perror(progname);
         return -1;
      }
   }

   return 0;
}

int main(int argc, char *argv[]){
   int c, status = EXIT_SUCCESS;
   int (*vcat)() = lcat;

   while ((c = getopt(argc, argv, "hls")) >= 0) {
      switch (c){
         case 'h':
            printf("Usage: %s [-h] [-l] [-s] files ... \n", progname);
            return EXIT_SUCCESS;
         case 's':
            vcat = scat;
            break;
         case 'l':
            vcat = lcat;
            break;
         default:
            return EXIT_FAILURE;
      }
   }

   if (optind == argc) {
      if (vcat(NULL) < 0) {
         status = EXIT_FAILURE;
      }
   }else{
      for (; optind < argc; optind++) {
         if (vcat(argv[optind]) < 0) {
            status = EXIT_FAILURE;
         }
      }
   }

   return status;
}

これは私が使用するコマンドです:

time ./scat -s < some-large-file > /dev/null

関連情報