我已经使用系统函数 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