시스템 호출 시간 측정

시스템 호출 시간 측정

시스템 함수 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

관련 정보