Chinaunix
标题:
重定向的内核实现
[打印本页]
作者:
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中的?
[root@centos6 ~]# 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 的选项,有没有显示更详细的信息。
作者:
whpu000625
时间:
2017-02-13 21:47
回复
10#
Godbach
看了一下strace的参数,没有能够显示更详细内容的。
我现在就是想知道执行"echo 0 > file"后,是如何将0写入到file文件中的。
至少应该有open该文件的系统调用吧,但是用strace却没看到?那么系统是如何做到的呢?
作者:
sditmaner
时间:
2017-02-14 12:06
回复 5# whpu000625
作者:
whpu000625
时间:
2017-02-14 13:35
回复
12#
sditmaner
说什么了?
作者:
咸鱼1988
时间:
2017-02-15 08:56
这个"echo 0 > file"语句是shell执行的,尝试下写个test.sh文件
#!/bin/sh
echo 0 > file
复制代码
然后用strace跟踪这个shell文件的执行
作者:
whpu000625
时间:
2017-02-15 10:07
回复
14#
咸鱼1988
execve("./test.sh", ["./test.sh"], [/* 21 vars */]) = 0
brk(0) = 0x1815000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f65f2392000
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) = 0x7f65f238d000
close(3) = 0
open("/lib64/libtinfo.so.5", O_RDONLY) = 3
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
fstat(3, {st_mode=S_IFREG|0755, st_size=135896, ...}) = 0
mmap(NULL, 2232320, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f65f1f53000
mprotect(0x7f65f1f70000, 2097152, PROT_NONE) = 0
mmap(0x7f65f2170000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1d000) = 0x7f65f2170000
close(3) = 0
open("/lib64/libdl.so.2", O_RDONLY) = 3
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
fstat(3, {st_mode=S_IFREG|0755, st_size=19536, ...}) = 0
mmap(NULL, 2109696, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f65f1d4f000
mprotect(0x7f65f1d51000, 2097152, PROT_NONE) = 0
mmap(0x7f65f1f51000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7f65f1f51000
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, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f65f238c000
mmap(NULL, 3750152, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f65f19bb000
mprotect(0x7f65f1b46000, 2093056, PROT_NONE) = 0
mmap(0x7f65f1d45000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x18a000) = 0x7f65f1d45000
mmap(0x7f65f1d4a000, 18696, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f65f1d4a000
close(3) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f65f238b000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f65f238a000
arch_prctl(ARCH_SET_FS, 0x7f65f238b700) = 0
mprotect(0x7f65f1d45000, 16384, PROT_READ) = 0
mprotect(0x7f65f1f51000, 4096, PROT_READ) = 0
mprotect(0x7f65f2393000, 4096, PROT_READ) = 0
munmap(0x7f65f238d000, 17666) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
open("/dev/tty", O_RDWR|O_NONBLOCK) = 3
close(3) = 0
brk(0) = 0x1815000
brk(0x1836000) = 0x1836000
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) = 0x7f65ebb2a000
close(3) = 0
getuid() = 0
getgid() = 0
geteuid() = 0
getegid() = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
gettimeofday({1487153274, 647747}, NULL) = 0
open("/proc/meminfo", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f65f2391000
read(3, "MemTotal: 1020076 kB\nMemF"..., 1024) = 1024
close(3) = 0
munmap(0x7f65f2391000, 4096) = 0
rt_sigaction(SIGCHLD, {SIG_DFL, [], SA_RESTORER, 0x7f65f19ed9a0}, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGCHLD, {SIG_DFL, [], SA_RESTORER, 0x7f65f19ed9a0}, {SIG_DFL, [], SA_RESTORER, 0x7f65f19ed9a0}, 8) = 0
rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x7f65f19ed9a0}, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x7f65f19ed9a0}, {SIG_DFL, [], SA_RESTORER, 0x7f65f19ed9a0}, 8) = 0
rt_sigaction(SIGQUIT, {SIG_DFL, [], SA_RESTORER, 0x7f65f19ed9a0}, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGQUIT, {SIG_DFL, [], SA_RESTORER, 0x7f65f19ed9a0}, {SIG_DFL, [], SA_RESTORER, 0x7f65f19ed9a0}, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
rt_sigaction(SIGQUIT, {SIG_IGN, [], SA_RESTORER, 0x7f65f19ed9a0}, {SIG_DFL, [], SA_RESTORER, 0x7f65f19ed9a0}, 8) = 0
uname({sys="Linux", node="centos6.5-make", ...}) = 0
stat("/root", {st_mode=S_IFDIR|0550, st_size=4096, ...}) = 0
stat(".", {st_mode=S_IFDIR|0550, st_size=4096, ...}) = 0
getpid() = 31049
open("/usr/lib64/gconv/gconv-modules.cache", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=26060, ...}) = 0
mmap(NULL, 26060, PROT_READ, MAP_SHARED, 3, 0) = 0x7f65f2383000
close(3) = 0
getppid() = 31048
gettimeofday({1487153274, 649657}, NULL) = 0
getpgrp() = 31048
rt_sigaction(SIGCHLD, {0x43f2b0, [], SA_RESTORER, 0x7f65f19ed9a0}, {SIG_DFL, [], SA_RESTORER, 0x7f65f19ed9a0}, 8) = 0
getrlimit(RLIMIT_NPROC, {rlim_cur=7838, rlim_max=7838}) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
open("./test.sh", O_RDONLY) = 3
ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fff1d061f40) = -1 ENOTTY (Inappropriate ioctl for device)
lseek(3, 0, SEEK_CUR) = 0
read(3, "#!/bin/sh\necho 0 > file\n", 80) = 24
lseek(3, 0, SEEK_SET) = 0
getrlimit(RLIMIT_NOFILE, {rlim_cur=1024, rlim_max=4*1024}) = 0
fcntl(255, F_GETFD) = -1 EBADF (Bad file descriptor)
dup2(3, 255) = 255
close(3) = 0
fcntl(255, F_SETFD, FD_CLOEXEC) = 0
fcntl(255, F_GETFL) = 0x8000 (flags O_RDONLY|O_LARGEFILE)
fstat(255, {st_mode=S_IFREG|0755, st_size=24, ...}) = 0
lseek(255, 0, SEEK_CUR) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(255, "#!/bin/sh\necho 0 > file\n", 24) = 24
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
open("file", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
fcntl(1, F_GETFD) = 0
fcntl(1, F_DUPFD, 10) = 10
fcntl(1, F_GETFD) = 0
fcntl(10, F_SETFD, FD_CLOEXEC) = 0
dup2(3, 1) = 1
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) = 0x7f65f2391000
write(1, "0\n", 2) = 2
dup2(10, 1) = 1
fcntl(10, F_GETFD) = 0x1 (flags FD_CLOEXEC)
close(10) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(255, "", 24) = 0
exit_group(0) = ?
复制代码
作者:
nswcfd
时间:
2017-02-15 11:17
本帖最后由 nswcfd 于 2017-02-15 11:21 编辑
> 发生在bash层面,在strace执行之前就已经发生了。
strace -e open,dup,dup2,write -f bash -c 'echo > xxx'
有人已经回答过了,请忽略。
作者:
nswcfd
时间:
2017-02-15 11:18
本帖最后由 nswcfd 于 2017-02-15 11:19 编辑
=====删除重复发帖=====
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2