当我"strace"以下C程序时,time()不会调用系统调用.
#include <time.h>
int main() {
return (int)time(NULL);
}
Run Code Online (Sandbox Code Playgroud)
为什么不?它从哪里获得时间?这是Ubuntu 12.04上的完整strace输出.
$ gcc -Wall -o testtime testtime.c && strace ./testtime
execve("./testtime", ["./testtime"], [/* 34 vars */]) = 0
brk(0) = 0x11f1000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd6e052f000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=38828, ...}) = 0
mmap(NULL, 38828, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fd6e0525000
close(3) = 0 …
Run Code Online (Sandbox Code Playgroud) 考虑到自动转换,C编译器如何解释表示长整数文字的"L"?以下代码在32位平台(32位长,64位长)上运行时,似乎将表达式"(0xffffffffL)"转换为64位整数4294967295,而不是32位-1.
示例代码:
#include <stdio.h>
int main(void)
{
long long x = 10;
long long y = (0xffffffffL);
long long z = (long)(0xffffffffL);
printf("long long x == %lld\n", x);
printf("long long y == %lld\n", y);
printf("long long z == %lld\n", z);
printf("0xffffffffL == %ld\n", 0xffffffffL);
if (x > (long)(0xffffffffL))
printf("x > (long)(0xffffffffL)\n");
else
printf("x <= (long)(0xffffffffL)\n");
if (x > (0xffffffffL))
printf("x > (0xffffffffL)\n");
else
printf("x <= (0xffffffffL)\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出(在32位Debian上使用GCC 4.5.3编译):
long long x == 10
long long y == …
Run Code Online (Sandbox Code Playgroud)