‚â‚è’¼‚µCŒ¾ŒêFƒCƒ“ƒ^[ƒ|ƒWƒVƒ‡ƒjƒ“ƒO‚É‚æ‚étime(3)‚̃Xƒ^ƒu‰»

Posted by Hiraku on 2015-09-13

CŒ¾Œê‚Ì–{‚ð‹v‚µ‚Ô‚è‚É“Ç‚Ý•Ô‚µ‚Ä‚¢‚é‚Ì‚Å‚·‚ªAƒCƒ“ƒ^[ƒ|ƒWƒVƒ‡ƒjƒ“ƒO(interpose, interposition)‚Ȃ錾—t‚ð‰‚ß‚Ä’m‚Á‚½‚̂сƒ‚‚Å‚·B

uC•W€ƒ‰ƒCƒuƒ‰ƒŠŠÖ”‚È‚Ç‚ðƒ[ƒJƒ‹’è‹`‚̊֐”‚ŏ㏑‚«‚Å‚«‚Ä‚µ‚Ü‚¤v‚Æ‚¢‚¤‚¨˜b‚Å‚·B‚¤‚Á‚©‚è‚â‚ç‚©‚·‚ƃoƒO‚̉·°‚É‚È‚é‚Ì‚Å‚·‚ªA‚¤‚Ü‚­Žg‚¦‚΃†ƒjƒbƒgƒeƒXƒg‚̃Xƒ^ƒu‚Æ‚µ‚Ä•Ö—˜‚»‚¤B

timeŠÖ”‚ɂ‚¢‚Ä‚¨‚³‚ç‚¢

—á‚Æ‚µ‚ÄŽv‚¢‚‚¢‚½‚̂ŁAtime(3)‚ðã‘‚«‚µ‚Ä‚Ý‚Ü‚·B

time(3)‚ÍŒ»ÝŽž‚ðUNIX time(time_tŒ^)‚Ŏ擾‚·‚éC•W€ƒ‰ƒCƒuƒ‰ƒŠ•t‘®‚̊֐”‚Å‚·BÚ×‚Íman 3 time‚ŁB‚±‚̊֐”AŽÀsŽžŠÔ‚É‚æ‚Á‚ÄŒ‹‰Ê‚ªí‚ɈقȂé‚킯‚ŁAƒ†ƒjƒbƒgƒeƒXƒg‚ÌŽž‚͍¢‚èŽÒ‚Å‚·B

/* time_ex.c */
#include <stdio.h>
#include <time.h>

int main(void) {
  printf("%ld", time(NULL));
  return 0;
}
$ cc time_ex.c && ./a.out
(Œ»ÝŽž‚É‘Š“–‚·‚éunix time‚ª•\Ž¦‚³‚ê‚é)

u‚à‚µAŒß‘O’†‚¾‚Á‚½‚çA‚ðs‚¢AŒßŒã‚¾‚Á‚½‚çB‚ðs‚¤vu2015”N‚Ì9ŒŽ1“úˆÈŒã‚Ì‚Ý—LŒø‚É‚È‚éif•¶v‚Ý‚½‚¢‚ȁAŒ»ÝŽž‚ðƒx[ƒX‚ÉðŒ•ªŠò‚·‚é‚悤‚ȃƒWƒbƒN‚ª‚ ‚é‚ƁAŒ‹‰Ê‚ªˆÀ’肵‚È‚¢‚Ì‚Å‚¤‚Ü‚­ƒ†ƒjƒbƒgƒeƒXƒg‚ª‘‚¯‚Ü‚¹‚ñB

timeŠÖ”‚ðƒXƒ^ƒu‚É‚Å‚«‚ê‚΂¢‚¢‚킯‚ŁA‚±‚±‚ŃCƒ“ƒ^[ƒ|ƒWƒVƒ‡ƒjƒ“ƒO‚ªŽg‚¦‚Ü‚·B

ƒCƒ“ƒ^[ƒ|ƒWƒVƒ‡ƒjƒ“ƒO‚É‚æ‚éã‘‚«

‚Ü‚¸‚̓yƒ^ƒyƒ^‘‚¢‚Ä‚Ý‚Ü‚·B

‚³‚Á‚«‚ÌmainŠÖ”‚Ì‘O‚ɁA•’Ê‚ÉtimeŠÖ”‚ð’è‹`‚µ‚Ü‚·B

/* time_ex2.c */
#include <stdio.h>
#include <time.h>

time_t time(time_t* tloc) {
  if (tloc == NULL) {
    return 0;
  }
  return *tloc = 0;
}

int main(void) {
  printf("%ld", time(NULL));
  return 0;
}
$ cc time_ex2.c && ./a.out
0

‚½‚Ô‚ñ‰½“xŽÀs‚µ‚Ä‚à0‚ª•\Ž¦‚³‚ê‚é‚悤‚É‚È‚Á‚½‚Í‚¸BƒRƒ“ƒpƒCƒ‹Žž‚É‚àA‰½‚̃Gƒ‰[‚ào‚Ü‚¹‚ñB‚±‚ê‚ÍŠm‚©‚É‚â‚ç‚©‚·‚Æ‹C‚«‚É‚­‚¢ƒoƒO‚É‚È‚é‚©‚àBB

‚±‚ê‚ŃXƒ^ƒu‚É‚Í‚Å‚«‚Ü‚µ‚½‚ªA–{—ˆ‚â‚肽‚©‚Á‚½ƒvƒƒOƒ‰ƒ€‚ð‰ü•Ï‚µ‚Ä‚¢‚é‚Ì‚Æ‚ ‚Ü‚èˆá‚¢‚ª‚ ‚è‚Ü‚¹‚ñBƒeƒXƒg‚µ‚½‚¢Žž‚¾‚¯A“®“I‚ɐ؂è‘Ö‚¦‚½‚¢‚Æ‚±‚ë‚Å‚·B

‚±‚̏ꍇAtimeŠÖ”–{‘̂̃‰ƒCƒuƒ‰ƒŠ‚̓_ƒCƒiƒ~ƒbƒNƒŠƒ“ƒN‚µ‚Ă邾‚¯‚Ȃ̂ŁAƒ‰ƒCƒuƒ‰ƒŠ‚̃[ƒh‡‚ð‚¢‚¶‚Á‚Ä‚â‚é‚ƁAŠÈ’P‚ɏ㏑‚«‚Å‚«‚½‚肵‚Ü‚·B

ƒXƒ^ƒu‚ÌtimeŠÖ”‚ðØ‚è—£‚·

ƒXƒ^ƒu‚ÌtimeŠÖ”‚¾‚¯Aƒ_ƒCƒiƒ~ƒbƒNƒŠƒ“ƒN—p‚̃‰ƒCƒuƒ‰ƒŠ‚Æ‚µ‚ărƒ‹ƒh‚·‚ê‚ÎOKB ‚½‚¾AOS‚É‚æ‚Á‚Ä‚±‚Ì•Ó‚ÌŽd‘g‚Ý‚Í‚¾‚¢‚ԈႤ‚悤‚ŁAƒRƒ}ƒ“ƒh‚àˆá‚¢‚Ü‚·B‚±‚±‚Å‚ÍMac OS X‚ÅŽŽ‚µ‚Ä‚Ý‚Ü‚·B

/* time_stub.c */
#include <time.h>

time_t time(time_t* tloc) {
  if (tloc == NULL) {
    return 0;
  }
  return *tloc = 0;
}
$ clang -shared -fPIC -o libtime_stub.dylib time_stub.c
$ ls
libtime_stub.dylib time_stub.c

Šm‚©Å‹ß‚ÌMac‚Å‚Í"gcc"ƒRƒ}ƒ“ƒh‚Íclang‚̃GƒCƒŠƒAƒX‚É‚È‚Á‚Ä‚¢‚é‚̂ŁAclang‚Ì‘ã‚í‚è‚ÉgccƒRƒ}ƒ“ƒh‚ð‘Å‚Á‚Ä‚àŒ‹‰Ê‚Í“¯‚¶‚È‚Í‚¸B

‚ ‚Ƃ́A‚±‚̏o—ˆã‚ª‚Á‚½libtime_stub.dylib‚ð•W€ƒ‰ƒCƒuƒ‰ƒŠ‚Ì‘O‚ɓǂݍž‚Ü‚¹‚āAŽÀs‚·‚ê‚ÎOKBÅ‰‚Ìtime_ex.c‚ðƒrƒ‹ƒh‚µ‚½a.out‚ª“¯‚¶ƒfƒBƒŒƒNƒgƒŠ‚É‚ ‚é‚Æ‚µ‚āA‚±‚ñ‚ÈŠ´‚¶‚Å‚·B

$ ./a.out
1442144345
$ DYLD_FORCE_FLAT_NAMESPACE=1 DYLD_INSERT_LIBRARIES=libtime_stub.dylib ./a.out
0

ŠÂ‹«•Ï”‚ðŽg‚Á‚āAæ‚ɃXƒ^ƒu‚̃‰ƒCƒuƒ‰ƒŠ‚ð“ǂݍž‚Ü‚¹‚邱‚ƂŁAtimeŠÖ”‚ðã‘‚«‚Å‚«‚Ü‚µ‚½I

‚à‚Á‚Ætime_stub‚Å—V‚Ô

ðŒ‚ª‡‚¦‚΁A•Ê‚É‚³‚Á‚«‚Ìa.out‚¶‚á‚È‚­‚Ä‚à“¯‚¶‚悤‚ÉtimeŠÖ”‚ðã‘‚«‚µ‚½ó‘Ô‚É‚Å‚«‚Ü‚·B

—Ⴆ‚΁AdateƒRƒ}ƒ“ƒhBŽÀs‚·‚é‚ÆŒ»ÝŽž‚ð•\Ž¦‚µ‚Ä‚­‚ê‚é‚Í‚¸‚Å‚·‚ªAlibtime_stub.dylib‚ł̏㏑‚«‚ª—LŒø‚Á‚Û‚¢B

$ DYLD_FORCE_FLAT_NAMESPACE=1 DYLD_INSERT_LIBRARIES=libtime_stub.dylib date
1970”N 1ŒŽ 1“ú –Ø—j“ú 09Žž00•ª00•b JST

1970”N‚Ƀ^ƒCƒ€ƒXƒŠƒbƒv‚µ‚½‚Ý‚½‚¢‚ÅŠy‚µ‚¢I ‚»‚ë‚»‚ë–Ê“|‚­‚³‚­‚È‚Á‚Ä‚«‚½‚Ì‚Åexport‚µ‚āA‘¼‚̃Rƒ}ƒ“ƒh‚àŽŽ‚µ‚Ä‚Ý‚Ü‚·B

$ export DYLD_FORCE_FLAT_NAMESPACE=1 DYLD_INSERT_LIBRARIES=libtime_stub.dylib

$ date
1970”N 1ŒŽ 1“ú –Ø—j“ú 09Žž00•ª00•b JST
$ cal
      1ŒŽ 1970
“ú ŒŽ ‰Î … –Ø ‹à “y
             1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

$ perl -e 'print time();'
0

$ php -r 'echo date("c");'
1970-01-01T00:00:00+00:00
$ php -r 'echo date_create()->format("c");'
1970-01-01T00:00:00+00:00

$ ruby -e 'require "date"; puts DateTime.now'
2015-09-13T20:48:26+09:00

$ python -c 'import datetime; print datetime.datetime.now()'
2015-09-13 20:57:05.795197

$ node -e 'console.log(Date.now())'
1442145688533

‚ӂށBBPHP‚âPerl‚¾‚Ætime(3)‚ðã‘‚«‚·‚ê‚΁A‹““®‚Æ‚µ‚Ä‚àã‘‚«‚Å‚«‚¿‚á‚Á‚Ä‚é‚Ý‚½‚¢‚Å‚·‚ˁB Ruby‚âPythonANode.js‚͉e‹¿‚ðŽó‚¯‚È‚¢‚Ý‚½‚¢‚Å‚·B’†g‚Í‘S‘R’m‚ç‚È‚¢‚¯‚ǁAtime(3)‚ðŽg‚Á‚Ä‚È‚¢‚Æ‚¢‚¤‚±‚Æ‚©‚ȁcH

‚Ü‚Æ‚ß

  • CŒ¾Œê‚Å‚à•W€ŠÖ”‚̏㏑‚«‚ª‚Å‚«‚é‚æ
  • ‚½‚¾Aƒ‰ƒCƒuƒ‰ƒŠ‚̃[ƒh‚ð‚¢‚¶‚é‚â‚è•û‚ÍOSˆË‘¶‚ªŒƒ‚µ‚¢‚̂ŁA‚Å‚«‚ê‚Î”ð‚¯‚½‚Ù‚¤‚ª‚¢‚¢‚Æ‚ÍŽv‚¤
  • ‚¤‚Ü‚­Žg‚¦‚Ίy‚µ‚»‚¤B‚Å‚àƒoƒO‚ÌŒ´ˆö‚É‚à‚È‚è‚â‚·‚¢‚Ì‚Å‹C‚ð‚‚¯‚é

CŒ¾Œê‚à•¶–@‚Ì‹CŽ‚¿ˆ«‚³‚ÉŠµ‚ê‚Ä‚µ‚Ü‚¦‚΁A‚·‚²‚­‰œ‚ª[‚­‚ÄŠy‚µ‚¢‚Å‚·‚ˁB


ƒGƒLƒXƒp[ƒgCƒvƒƒOƒ‰ƒ~ƒ“ƒO\’m‚ç‚ê‚´‚éC‚̐[‘w (Ascii books)

coding‚̍ŐV‹LŽ–