コード(time.c)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define _GNU_SOURCE
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>
#define SYS_clock_gettime32 20
#define SYS_clock_gettime64 228
struct timespec32_test {
int tv_sec;
int tv_nsec;
};
struct timespec64_test {
long long int tv_sec;
long long int tv_nsec;
};
void printf_timespec(struct timespec *tp, int ret, char *mes)
{
printf("%-40s " ,mes);
printf("tv_sec=%-12ld ",tp->tv_sec);
printf("tv_nsec=%-12ld ",tp->tv_nsec);
printf("ret=%d\n",ret);
}
void printf_timespec32_test(struct timespec32_test *tp, int ret, char *mes)
{
printf("%-40s ",mes);
printf("tv_sec=%-12d ",tp->tv_sec);
printf("tv_nsec=%-12d ",tp->tv_nsec);
printf("ret=%d\n",ret);
}
void printf_timespec64_test(struct timespec64_test *tp, int ret, char *mes)
{
printf("%-40s ",mes);
printf("tv_sec=%-12lld ",tp->tv_sec);
printf("tv_nsec=%-12lld ",tp->tv_nsec);
printf("ret=%d\n",ret);
}
int main()
{
struct timespec tp;
struct timespec64_test tp64;
#if defined(__i386__) || defined(__ILP32__)
struct timespec32_test tp32;
#endif
pid_t pid;
int ret;
char *mes;
pid=getpid();
printf("PID=%d\n",pid);
mes = "glibc clock_gettime-long int";
tp.tv_sec=tp.tv_nsec=0;
ret = clock_gettime(CLOCK_REALTIME,&tp);
printf_timespec(&tp, ret, mes);
#if defined(__i386__) || defined(__ILP32__)
mes = "Assemble=>i386 int 0x80-timespec-32bit";
tp32.tv_sec=tp32.tv_nsec=0;
__asm__ volatile(
"int $0x80;"
:"=a"(ret)
:"0"(SYS_clock_gettime),
"b"(CLOCK_REALTIME),
"c"(&tp32)
);
printf_timespec32_test(&tp32, ret, mes);
mes = "Assemble=>i386 int 0x80-timespec-64bit";
tp64.tv_sec=tp64.tv_nsec=0;
__asm__ volatile(
"int $0x80;"
:"=a"(ret)
:"0"(SYS_clock_gettime),
"b"(CLOCK_REALTIME),
"c"(&tp64)
);
printf_timespec64_test(&tp64, ret, mes);
#else
mes = "Assemble=>x86_64 syscall-timespec-64bit";
tp64.tv_sec=tp64.tv_nsec=0;
__asm__ volatile(
"syscall;"
:"=a"(ret)
:"0"(SYS_clock_gettime),
"D"(CLOCK_REALTIME),
"S"(&tp64)
:"memory"
);
printf_timespec64_test(&tp64, ret, mes);
#endif
return(EXIT_SUCCESS);
}