免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3145 | 回复: 16
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-01-20 15:16 |只看该作者 |倒序浏览
有哪位知道重定向功能是在内核的什么地方实现的,我现在想调查一个问题,找不到头绪。


论坛徽章:
1
15-16赛季CBA联赛之新疆
日期:2017-03-09 12:33:45
2 [报告]
发表于 2017-01-20 20:13 |只看该作者
回复 1# whpu000625

重定向根本没有内核的代码处理,如果说真的有,就是打开文件,关闭文件。还有就是dup,
对应内核的调用是 sys_open sys_close sys_dup

论坛徽章:
0
3 [报告]
发表于 2017-01-22 09:39 |只看该作者
jeppeter 发表于 2017-01-20 20:13
回复 1# whpu000625

重定向根本没有内核的代码处理,如果说真的有,就是打开文件,关闭文件。还有就是d ...

也就是说如果数据重定向到一个文件中,其实就是打开该文件,写入数据,关闭文件?

论坛徽章:
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
4 [报告]
发表于 2017-01-22 19:27 |只看该作者
2楼正解,本质就是dup/dup2。

论坛徽章:
0
5 [报告]
发表于 2017-02-10 17:26 |只看该作者
有人能解释一下下面的操作的内核流程么
  1. echo test > file
复制代码

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
6 [报告]
发表于 2017-02-11 22:35 |只看该作者
回复 5# whpu000625
可以用  strace 自己简单跟一下。



论坛徽章:
0
7 [报告]
发表于 2017-02-12 22:14 |只看该作者
回复 6# Godbach

没看到打开file文件的操作,不太明白是怎么把内容写入file中的?
  1. [root@centos6 ~]# strace echo 0 > file
  2. execve("/bin/echo", ["echo", "0"], [/* 23 vars */]) = 0
  3. brk(0)                                  = 0xdb5000
  4. mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f8995bb9000
  5. access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
  6. open("/etc/ld.so.cache", O_RDONLY)      = 3
  7. fstat(3, {st_mode=S_IFREG|0644, st_size=17666, ...}) = 0
  8. mmap(NULL, 17666, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f8995bb4000
  9. close(3)                                = 0
  10. open("/lib64/libc.so.6", O_RDONLY)      = 3
  11. 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
  12. fstat(3, {st_mode=S_IFREG|0755, st_size=1921216, ...}) = 0
  13. mmap(NULL, 3750152, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f8995607000
  14. mprotect(0x7f8995792000, 2093056, PROT_NONE) = 0
  15. mmap(0x7f8995991000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x18a000) = 0x7f8995991000
  16. mmap(0x7f8995996000, 18696, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f8995996000
  17. close(3)                                = 0
  18. mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f8995bb3000
  19. mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f8995bb2000
  20. mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f8995bb1000
  21. arch_prctl(ARCH_SET_FS, 0x7f8995bb2700) = 0
  22. mprotect(0x7f8995991000, 16384, PROT_READ) = 0
  23. mprotect(0x7f8995bba000, 4096, PROT_READ) = 0
  24. munmap(0x7f8995bb4000, 17666)           = 0
  25. brk(0)                                  = 0xdb5000
  26. brk(0xdd6000)                           = 0xdd6000
  27. open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
  28. fstat(3, {st_mode=S_IFREG|0644, st_size=99158576, ...}) = 0
  29. mmap(NULL, 99158576, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f898f776000
  30. close(3)                                = 0
  31. fstat(1, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
  32. mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f8995bb8000
  33. write(1, "0\n", 2)                      = 2
  34. close(1)                                = 0
  35. munmap(0x7f8995bb8000, 4096)            = 0
  36. close(2)                                = 0
  37. exit_group(0)                           = ?
复制代码

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
8 [报告]
发表于 2017-02-12 23:22 |只看该作者
回复 7# whpu000625

write(1, "0\n", 2)

这一行看到了吗。


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

这一行是往标准输入里面写,那又是怎么写到file文件的呢?
难道file文件的描述符是1?file文件什么时候被打开的?

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
10 [报告]
发表于 2017-02-13 18:46 |只看该作者
回复 9# whpu000625

echo 本身是打到标准输出的,然后标准输出被重定向。 你再看下 strace 的选项,有没有显示更详细的信息。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP