システム関数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