![시스템 호출 시간 측정](https://linux55.com/image/161078/%EC%8B%9C%EC%8A%A4%ED%85%9C%20%ED%98%B8%EC%B6%9C%20%EC%8B%9C%EA%B0%84%20%EC%B8%A1%EC%A0%95.png)
시스템 함수 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