免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: whpu000625
打印 上一主题 下一主题

[文件系统] 重定向的内核实现 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2017-02-13 21:47 |只看该作者
回复 10# Godbach

看了一下strace的参数,没有能够显示更详细内容的。
我现在就是想知道执行"echo 0 > file"后,是如何将0写入到file文件中的。
至少应该有open该文件的系统调用吧,但是用strace却没看到?那么系统是如何做到的呢?

论坛徽章:
2
综合交流区版块每日发帖之星
日期:2016-07-06 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:00
12 [报告]
发表于 2017-02-14 12:06 |只看该作者
回复 5# whpu000625

论坛徽章:
0
13 [报告]
发表于 2017-02-14 13:35 |只看该作者
回复 12# sditmaner

说什么了?

论坛徽章:
0
14 [报告]
发表于 2017-02-15 08:56 |只看该作者
这个"echo 0 > file"语句是shell执行的,尝试下写个test.sh文件

  1. #!/bin/sh
  2. echo 0 > file
复制代码


然后用strace跟踪这个shell文件的执行

论坛徽章:
0
15 [报告]
发表于 2017-02-15 10:07 |只看该作者
回复 14# 咸鱼1988

  1. execve("./test.sh", ["./test.sh"], [/* 21 vars */]) = 0
  2. brk(0)                                  = 0x1815000
  3. mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f65f2392000
  4. access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
  5. open("/etc/ld.so.cache", O_RDONLY)      = 3
  6. fstat(3, {st_mode=S_IFREG|0644, st_size=17666, ...}) = 0
  7. mmap(NULL, 17666, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f65f238d000
  8. close(3)                                = 0
  9. open("/lib64/libtinfo.so.5", O_RDONLY)  = 3
  10. read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@\310\0\0\0\0\0\0"..., 832) = 832
  11. fstat(3, {st_mode=S_IFREG|0755, st_size=135896, ...}) = 0
  12. mmap(NULL, 2232320, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f65f1f53000
  13. mprotect(0x7f65f1f70000, 2097152, PROT_NONE) = 0
  14. mmap(0x7f65f2170000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1d000) = 0x7f65f2170000
  15. close(3)                                = 0
  16. open("/lib64/libdl.so.2", O_RDONLY)     = 3
  17. read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340\r\0\0\0\0\0\0"..., 832) = 832
  18. fstat(3, {st_mode=S_IFREG|0755, st_size=19536, ...}) = 0
  19. mmap(NULL, 2109696, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f65f1d4f000
  20. mprotect(0x7f65f1d51000, 2097152, PROT_NONE) = 0
  21. mmap(0x7f65f1f51000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7f65f1f51000
  22. close(3)                                = 0
  23. open("/lib64/libc.so.6", O_RDONLY)      = 3
  24. read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000\356\1\0\0\0\0\0"..., 832) = 832
  25. fstat(3, {st_mode=S_IFREG|0755, st_size=1921216, ...}) = 0
  26. mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f65f238c000
  27. mmap(NULL, 3750152, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f65f19bb000
  28. mprotect(0x7f65f1b46000, 2093056, PROT_NONE) = 0
  29. mmap(0x7f65f1d45000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x18a000) = 0x7f65f1d45000
  30. mmap(0x7f65f1d4a000, 18696, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f65f1d4a000
  31. close(3)                                = 0
  32. mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f65f238b000
  33. mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f65f238a000
  34. arch_prctl(ARCH_SET_FS, 0x7f65f238b700) = 0
  35. mprotect(0x7f65f1d45000, 16384, PROT_READ) = 0
  36. mprotect(0x7f65f1f51000, 4096, PROT_READ) = 0
  37. mprotect(0x7f65f2393000, 4096, PROT_READ) = 0
  38. munmap(0x7f65f238d000, 17666)           = 0
  39. rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
  40. open("/dev/tty", O_RDWR|O_NONBLOCK)     = 3
  41. close(3)                                = 0
  42. brk(0)                                  = 0x1815000
  43. brk(0x1836000)                          = 0x1836000
  44. open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
  45. fstat(3, {st_mode=S_IFREG|0644, st_size=99158576, ...}) = 0
  46. mmap(NULL, 99158576, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f65ebb2a000
  47. close(3)                                = 0
  48. getuid()                                = 0
  49. getgid()                                = 0
  50. geteuid()                               = 0
  51. getegid()                               = 0
  52. rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
  53. gettimeofday({1487153274, 647747}, NULL) = 0
  54. open("/proc/meminfo", O_RDONLY|O_CLOEXEC) = 3
  55. fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
  56. mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f65f2391000
  57. read(3, "MemTotal:        1020076 kB\nMemF"..., 1024) = 1024
  58. close(3)                                = 0
  59. munmap(0x7f65f2391000, 4096)            = 0
  60. rt_sigaction(SIGCHLD, {SIG_DFL, [], SA_RESTORER, 0x7f65f19ed9a0}, {SIG_DFL, [], 0}, 8) = 0
  61. rt_sigaction(SIGCHLD, {SIG_DFL, [], SA_RESTORER, 0x7f65f19ed9a0}, {SIG_DFL, [], SA_RESTORER, 0x7f65f19ed9a0}, 8) = 0
  62. rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x7f65f19ed9a0}, {SIG_DFL, [], 0}, 8) = 0
  63. rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x7f65f19ed9a0}, {SIG_DFL, [], SA_RESTORER, 0x7f65f19ed9a0}, 8) = 0
  64. rt_sigaction(SIGQUIT, {SIG_DFL, [], SA_RESTORER, 0x7f65f19ed9a0}, {SIG_DFL, [], 0}, 8) = 0
  65. rt_sigaction(SIGQUIT, {SIG_DFL, [], SA_RESTORER, 0x7f65f19ed9a0}, {SIG_DFL, [], SA_RESTORER, 0x7f65f19ed9a0}, 8) = 0
  66. rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
  67. rt_sigaction(SIGQUIT, {SIG_IGN, [], SA_RESTORER, 0x7f65f19ed9a0}, {SIG_DFL, [], SA_RESTORER, 0x7f65f19ed9a0}, 8) = 0
  68. uname({sys="Linux", node="centos6.5-make", ...}) = 0
  69. stat("/root", {st_mode=S_IFDIR|0550, st_size=4096, ...}) = 0
  70. stat(".", {st_mode=S_IFDIR|0550, st_size=4096, ...}) = 0
  71. getpid()                                = 31049
  72. open("/usr/lib64/gconv/gconv-modules.cache", O_RDONLY) = 3
  73. fstat(3, {st_mode=S_IFREG|0644, st_size=26060, ...}) = 0
  74. mmap(NULL, 26060, PROT_READ, MAP_SHARED, 3, 0) = 0x7f65f2383000
  75. close(3)                                = 0
  76. getppid()                               = 31048
  77. gettimeofday({1487153274, 649657}, NULL) = 0
  78. getpgrp()                               = 31048
  79. rt_sigaction(SIGCHLD, {0x43f2b0, [], SA_RESTORER, 0x7f65f19ed9a0}, {SIG_DFL, [], SA_RESTORER, 0x7f65f19ed9a0}, 8) = 0
  80. getrlimit(RLIMIT_NPROC, {rlim_cur=7838, rlim_max=7838}) = 0
  81. rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
  82. open("./test.sh", O_RDONLY)             = 3
  83. ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fff1d061f40) = -1 ENOTTY (Inappropriate ioctl for device)
  84. lseek(3, 0, SEEK_CUR)                   = 0
  85. read(3, "#!/bin/sh\necho 0 > file\n", 80) = 24
  86. lseek(3, 0, SEEK_SET)                   = 0
  87. getrlimit(RLIMIT_NOFILE, {rlim_cur=1024, rlim_max=4*1024}) = 0
  88. fcntl(255, F_GETFD)                     = -1 EBADF (Bad file descriptor)
  89. dup2(3, 255)                            = 255
  90. close(3)                                = 0
  91. fcntl(255, F_SETFD, FD_CLOEXEC)         = 0
  92. fcntl(255, F_GETFL)                     = 0x8000 (flags O_RDONLY|O_LARGEFILE)
  93. fstat(255, {st_mode=S_IFREG|0755, st_size=24, ...}) = 0
  94. lseek(255, 0, SEEK_CUR)                 = 0
  95. rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
  96. read(255, "#!/bin/sh\necho 0 > file\n", 24) = 24
  97. rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
  98. open("file", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
  99. fcntl(1, F_GETFD)                       = 0
  100. fcntl(1, F_DUPFD, 10)                   = 10
  101. fcntl(1, F_GETFD)                       = 0
  102. fcntl(10, F_SETFD, FD_CLOEXEC)          = 0
  103. dup2(3, 1)                              = 1
  104. close(3)                                = 0
  105. fstat(1, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
  106. mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f65f2391000
  107. write(1, "0\n", 2)                      = 2
  108. dup2(10, 1)                             = 1
  109. fcntl(10, F_GETFD)                      = 0x1 (flags FD_CLOEXEC)
  110. close(10)                               = 0
  111. rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
  112. read(255, "", 24)                       = 0
  113. exit_group(0)                           = ?
复制代码

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
16 [报告]
发表于 2017-02-15 11:17 |只看该作者
本帖最后由 nswcfd 于 2017-02-15 11:21 编辑

> 发生在bash层面,在strace执行之前就已经发生了。
strace -e open,dup,dup2,write -f bash -c 'echo > xxx'

有人已经回答过了,请忽略。

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
17 [报告]
发表于 2017-02-15 11:18 |只看该作者
本帖最后由 nswcfd 于 2017-02-15 11:19 编辑

=====删除重复发帖=====
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP