重定向的内核实现
有哪位知道重定向功能是在内核的什么地方实现的,我现在想调查一个问题,找不到头绪。回复 1# whpu000625
重定向根本没有内核的代码处理,如果说真的有,就是打开文件,关闭文件。还有就是dup,
对应内核的调用是 sys_open sys_close sys_dup
jeppeter 发表于 2017-01-20 20:13
回复 1# whpu000625
重定向根本没有内核的代码处理,如果说真的有,就是打开文件,关闭文件。还有就是d ...
也就是说如果数据重定向到一个文件中,其实就是打开该文件,写入数据,关闭文件?
2楼正解,本质就是dup/dup2。 有人能解释一下下面的操作的内核流程么
echo test > file 回复 5# whpu000625
可以用strace 自己简单跟一下。
回复 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) = ?
回复 7# whpu000625
write(1, "0\n", 2)
这一行看到了吗。
回复 8# Godbach
这一行是往标准输入里面写,那又是怎么写到file文件的呢?
难道file文件的描述符是1?file文件什么时候被打开的?
回复 9# whpu000625
echo 本身是打到标准输出的,然后标准输出被重定向。 你再看下 strace 的选项,有没有显示更详细的信息。
页:
[1]
2