Логически несущественная разница для обоих системных вызовов
Если я изменю вашу программу, как показано ниже,
`
int main() {
struct timeval time_start, time_end;
int sockfd;
if ((sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) == -1) {
perror("socket error");
}
gettimeofday(&time_start, NULL);
close(sockfd);
gettimeofday(&time_end, NULL);
printf("close AF_INET: %ld \n", (time_end.tv_sec*1000000 + time_end.tv_usec) - (time_start.tv_sec*1000000 + time_start.tv_usec));
if ((sockfd = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW)) == -1) {
perror("socket error");
}
gettimeofday(&time_start, NULL);
close(sockfd);
gettimeofday(&time_end, NULL);
printf("close AF_PACKET: %ld \n", (time_end.tv_sec*1000000 + time_end.tv_usec) - (time_start.tv_sec*1000000 + time_start.tv_usec));
return 0;
}`
Я вижу результат как
shahul@shahul-VirtualBox:~/test$ ./a.out
close AF_INET: 3471
close AF_PACKET: 4
shahul@shahul-VirtualBox:~/test$ ./a.out
close AF_INET: 8
close AF_PACKET: 7
shahul@shahul-VirtualBox:~/test$ ./a.out
close AF_INET: 8
close AF_PACKET: 6
shahul@shahul-VirtualBox:~/test$ ./a.out
close AF_INET: 8
close AF_PACKET: 5
shahul@shahul-VirtualBox:~/test$ ./a.out
close AF_INET: 9
close AF_PACKET: 5
аналогично, если я изменю, как показано ниже,
int main() {
struct timeval time_start, time_end;
int sockfd;
if ((sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) == -1) {
perror("socket error");
}
gettimeofday(&time_start, NULL);
close(sockfd);
gettimeofday(&time_end, NULL);
printf("close AF_INET: %ld \n", (time_end.tv_sec*1000000 + time_end.tv_usec) - (time_start.tv_sec*1000000 + time_start.tv_usec));
if ((sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) == -1) {
perror("socket error");
}
gettimeofday(&time_start, NULL);
close(sockfd);
gettimeofday(&time_end, NULL);
printf("close AF_INET: %ld \n", (time_end.tv_sec*1000000 + time_end.tv_usec) - (time_start.tv_sec*1000000 + time_start.tv_usec));
if ((sockfd = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW)) == -1) {
perror("socket error");
}
gettimeofday(&time_start, NULL);
close(sockfd);
gettimeofday(&time_end, NULL);
printf("close AF_PACKET: %ld \n", (time_end.tv_sec*1000000 + time_end.tv_usec) - (time_start.tv_sec*1000000 + time_start.tv_usec));
return 0;
}
результат, как показано ниже,
shahul@shahul-VirtualBox:~/test$ ./a.out
close AF_INET: 6
close AF_INET: 3
close AF_PACKET: 3
shahul@shahul-VirtualBox:~/test$ ./a.out
close AF_INET: 8
close AF_INET: 4
close AF_PACKET: 5
shahul@shahul-VirtualBox:~/test$ ./a.out
close AF_INET: 8
close AF_INET: 4
close AF_PACKET: 4
shahul@shahul-VirtualBox:~/test$ ./a.out
close AF_INET: 8
close AF_INET: 4
close AF_PACKET: 4
вывод:
По сути, первый закрытый звонок занимает больше времени,
возможно, требуется время для отображения функции системного вызова впервые .