Chinaunix

标题: 用open创建的文件的权限为啥不确定 [打印本页]

作者: koolcoy    时间: 2010-05-28 11:31
标题: 用open创建的文件的权限为啥不确定
本帖最后由 koolcoy 于 2010-05-28 11:32 编辑

  1. #include <stdio.h>
  2. #include <sys/stat.h>
  3. #include <sys/types.h>
  4. #include <fcntl.h>
  5. #include <unistd.h>
  6. #include <string.h>
  7. #include <errno.h>

  8. int main() {
  9.         int i = 0;
  10.         for (i = 0; i < 500; ++i) {
  11.                 char buffer[512];
  12.                 sprintf(buffer, "./%d", i);
  13.                 close(open(buffer, O_WRONLY | O_CREAT));
  14.         }
  15. }
复制代码
如果open只传两个参数,创建的文件的权限似乎是不确定的。上面,程序执行后生成的文件权限不一样,有的有执行权限,有的没有~~~~,有人知道为啥吗?{:3_182:}
系统是centos 5.3 x86_64, 内核是2.6.18的
作者: 克拉玛依    时间: 2010-05-28 11:45
umask
作者: 没本    时间: 2010-05-28 11:51
嗯运行试了一下,我的是x86。感觉象是调用的还是三个参数的open,于是跟进反汇编里看了一下。
栈里第三个参数正好是循环变量i
mov    %edx,0x8(%esp)
所以导致open的文件属性呈周期性变化。看来两个参数的open在新的glibc里面不怎么可靠了,还是一直用三个的吧。

  1.    0x08048404 <+0>:     push   %ebp
  2.    0x08048405 <+1>:     mov    %esp,%ebp
  3.    0x08048407 <+3>:     and    $0xfffffff0,%esp
  4.    0x0804840a <+6>:     sub    $0x220,%esp
  5.    0x08048410 <+12>:    movl   $0x0,0x21c(%esp)
  6.    0x0804841b <+23>:    movl   $0x0,0x21c(%esp)
  7.    0x08048426 <+34>:    jmp    0x804846c <main+104>
  8.    0x08048428 <+36>:    mov    $0x8048540,%eax
  9.    0x0804842d <+41>:    mov    0x21c(%esp),%edx
  10.    0x08048434 <+48>:    mov    %edx,0x8(%esp)
  11.    0x08048438 <+52>:    mov    %eax,0x4(%esp)
  12.    0x0804843c <+56>:    lea    0x1c(%esp),%eax
  13.    0x08048440 <+60>:    mov    %eax,(%esp)
  14.    0x08048443 <+63>:    call   0x8048300 <sprintf@plt>
  15.    0x08048448 <+68>:    movl   $0x41,0x4(%esp)
  16.    0x08048450 <+76>:    lea    0x1c(%esp),%eax
  17.    0x08048454 <+80>:    mov    %eax,(%esp)
  18.    0x08048457 <+83>:    call   0x8048310 <open@plt>
  19.    0x0804845c <+88>:    mov    %eax,(%esp)
  20.    0x0804845f <+91>:    call   0x8048340 <close@plt>
  21.    0x08048464 <+96>:    addl   $0x1,0x21c(%esp)
  22.    0x0804846c <+104>:   cmpl   $0x31,0x21c(%esp)
  23.    0x08048474 <+112>:   jle    0x8048428 <main+36>
  24.    0x08048476 <+114>:   leave
  25.    0x08048477 <+115>:   ret
复制代码

作者: kellenforever    时间: 2010-05-28 12:25
是哈~还是用三个,确定些~!毕竟不同的内核版本,所定义的就会有所不同
作者: l2y3n2    时间: 2010-05-28 16:07
新版本的内核头文件open带O_CREAT不带第三个参数会直接报错。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2