- 论坛徽章:
- 0
|
不行啊,我不做任何判断直接在OPEN里return -1,然后输入touch命令依然会有文件被创建出来。
zonelight 发表于 2010-07-21 17:41
- # strace touch /tmp/test
- execve("/usr/bin/touch", ["touch", "/tmp/test"], [/* 52 vars */]) = 0
- brk(0) = 0x60d000
- mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f57db8b5000
- 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=154039, ...}) = 0
- mmap(NULL, 154039, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f57db88f000
- close(3) = 0
- open("/lib/librt.so.1", 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\"\0\0\0\0\0\0"..., 832) = 832
- fstat(3, {st_mode=S_IFREG|0755, st_size=35656, ...}) = 0
- mmap(NULL, 2132976, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f57db490000
- mprotect(0x7f57db498000, 2093056, PROT_NONE) = 0
- mmap(0x7f57db697000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x7000) = 0x7f57db697000
- close(3) = 0
- open("/lib/libc.so.6", 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\320\354\1\0\0\0\0\0"..., 832) = 832
- fstat(3, {st_mode=S_IFREG|0755, st_size=1399984, ...}) = 0
- mmap(NULL, 3508264, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f57db137000
- mprotect(0x7f57db287000, 2093056, PROT_NONE) = 0
- mmap(0x7f57db486000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x14f000) = 0x7f57db486000
- mmap(0x7f57db48b000, 18472, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f57db48b000
- close(3) = 0
- open("/lib/libpthread.so.0", 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\300Y\0\0\0\0\0\0"..., 832) = 832
- fstat(3, {st_mode=S_IFREG|0755, st_size=131038, ...}) = 0
- mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f57db88e000
- mmap(NULL, 2208640, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f57daf1b000
- mprotect(0x7f57daf32000, 2093056, PROT_NONE) = 0
- mmap(0x7f57db131000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16000) = 0x7f57db131000
- mmap(0x7f57db133000, 13184, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f57db133000
- close(3) = 0
- mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f57db88d000
- mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f57db88c000
- arch_prctl(ARCH_SET_FS, 0x7f57db88d700) = 0
- mprotect(0x7f57db131000, 4096, PROT_READ) = 0
- mprotect(0x7f57db486000, 16384, PROT_READ) = 0
- mprotect(0x7f57db697000, 4096, PROT_READ) = 0
- mprotect(0x60b000, 4096, PROT_READ) = 0
- mprotect(0x7f57db8b6000, 4096, PROT_READ) = 0
- munmap(0x7f57db88f000, 154039) = 0
- set_tid_address(0x7f57db88d9d0) = 313
- set_robust_list(0x7f57db88d9e0, 0x18) = 0
- futex(0x7fff1ce8263c, FUTEX_WAKE_PRIVATE, 1) = 0
- futex(0x7fff1ce8263c, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 1, NULL, 7f57db88d700) = -1 EAGAIN (Resource temporarily unavailable)
- rt_sigaction(SIGRTMIN, {0x7f57daf20840, [], SA_RESTORER|SA_SIGINFO, 0x7f57daf2a010}, NULL, 8) = 0
- rt_sigaction(SIGRT_1, {0x7f57daf208d0, [], SA_RESTORER|SA_RESTART|SA_SIGINFO, 0x7f57daf2a010}, NULL, 8) = 0
- rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
- getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM_INFINITY}) = 0
- brk(0) = 0x60d000
- brk(0x62e000) = 0x62e000
- open("/usr/lib64/locale/locale-archive", O_RDONLY) = 3
- fstat(3, {st_mode=S_IFREG|0644, st_size=1740208, ...}) = 0
- mmap(NULL, 1740208, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f57db6e3000
- close(3) = 0
- open("/tmp/test", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3
- dup2(3, 0) = 0
- close(3) = 0
- utimensat(0, NULL, NULL, 0) = 0
- close(0) = 0
- close(1) = 0
- close(2) = 0
- exit_group(0) = ?
- root@platinum:~
- #
复制代码 就是调用的 open
再来看 touch 源码
- static bool
- touch (const char *file)
- {
- bool ok;
- int fd = -1;
- int open_errno = 0;
- struct timespec const *t = newtime;
-
- if (STREQ (file, "-"))
- fd = STDOUT_FILENO;
- else if (! (no_create || no_dereference))
- {
- /* Try to open FILE, creating it if necessary. */
- fd = fd_reopen (STDIN_FILENO, file,
- O_WRONLY | O_CREAT | O_NONBLOCK | O_NOCTTY,
- S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
-
- /* Don't save a copy of errno if it's EISDIR, since that would lead
- touch to give a bogus diagnostic for e.g., `touch /' (assuming
- we don't own / or have write access to it). On Solaris 5.6,
- and probably other systems, it is EINVAL. On SunOS4, it's EPERM. */
- if (fd == -1 && errno != EISDIR && errno != EINVAL && errno != EPERM)
- open_errno = errno;
- }
复制代码 再来看 fd_reopen 的代码
- /* Open a file to a particular file descriptor. This is like standard
- `open', except it always returns DESIRED_FD if successful. */
-
- int
- fd_reopen (int desired_fd, char const *file, int flags, mode_t mode)
- {
- int fd = open (file, flags, mode);
-
- if (fd == desired_fd || fd < 0)
- return fd;
- else
- {
- int fd2 = dup2 (fd, desired_fd);
- int saved_errno = errno;
- close (fd);
- errno = saved_errno;
- return fd2;
- }
- }
复制代码 也证实了的确是使用的 open 函数,但是否对应内核态的 sys_open 系统调用就不清楚了 |
|