whpu000625 发表于 2017-01-20 15:16

重定向的内核实现

有哪位知道重定向功能是在内核的什么地方实现的,我现在想调查一个问题,找不到头绪。


jeppeter 发表于 2017-01-20 20:13

回复 1# whpu000625

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

whpu000625 发表于 2017-01-22 09:39

jeppeter 发表于 2017-01-20 20:13
回复 1# whpu000625

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

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

nswcfd 发表于 2017-01-22 19:27

2楼正解,本质就是dup/dup2。

whpu000625 发表于 2017-02-10 17:26

有人能解释一下下面的操作的内核流程么
echo test > file

Godbach 发表于 2017-02-11 22:35

回复 5# whpu000625
可以用strace 自己简单跟一下。



whpu000625 发表于 2017-02-12 22:14

回复 6# Godbach

没看到打开file文件的操作,不太明白是怎么把内容写入file中的?
# strace echo 0 > file
execve("/bin/echo", ["echo", "0"], [/* 23 vars */]) = 0
brk(0)                                  = 0xdb5000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f8995bb9000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=17666, ...}) = 0
mmap(NULL, 17666, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f8995bb4000
close(3)                              = 0
open("/lib64/libc.so.6", O_RDONLY)      = 3
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
fstat(3, {st_mode=S_IFREG|0755, st_size=1921216, ...}) = 0
mmap(NULL, 3750152, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f8995607000
mprotect(0x7f8995792000, 2093056, PROT_NONE) = 0
mmap(0x7f8995991000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x18a000) = 0x7f8995991000
mmap(0x7f8995996000, 18696, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f8995996000
close(3)                              = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f8995bb3000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f8995bb2000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f8995bb1000
arch_prctl(ARCH_SET_FS, 0x7f8995bb2700) = 0
mprotect(0x7f8995991000, 16384, PROT_READ) = 0
mprotect(0x7f8995bba000, 4096, PROT_READ) = 0
munmap(0x7f8995bb4000, 17666)         = 0
brk(0)                                  = 0xdb5000
brk(0xdd6000)                           = 0xdd6000
open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=99158576, ...}) = 0
mmap(NULL, 99158576, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f898f776000
close(3)                              = 0
fstat(1, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f8995bb8000
write(1, "0\n", 2)                      = 2
close(1)                              = 0
munmap(0x7f8995bb8000, 4096)            = 0
close(2)                              = 0
exit_group(0)                           = ?

Godbach 发表于 2017-02-12 23:22

回复 7# whpu000625

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

这一行看到了吗。


whpu000625 发表于 2017-02-13 11:04

回复 8# Godbach

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

Godbach 发表于 2017-02-13 18:46

回复 9# whpu000625

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

页: [1] 2
查看完整版本: 重定向的内核实现