我尝试使用open()设置O_CLOEXEC标志,没有成功.
考虑以下微测试:
#include <stdio.h> #include <fcntl.h> int main() { int fd = open("test.c",O_RDONLY | O_CLOEXEC); int ret = fcntl(fd,F_GETFL); if(ret & O_CLOEXEC) { printf("OK!\n"); } else { printf("FAIL!\n"); } printf("fd = %d\n",fd); printf("ret = %x,O_CLOEXEC = %x\n",ret,O_CLOEXEC); return 0; }
当使用内核版本2.6的linux上运行时,测试成功并打印“OK!”,但是失败了3.8或3.9内核.
怎么了?
谢谢!
解决方法
决定将O_CLOEXEC标志暴露给fcntl(fd,F_GETFL)是安全漏洞.内核3.6-rc7中的
this commit进行了更改:
commit c6f3d81115989e274c42a852222b80d2e14ced6f Author: Al Viro <viro@zeniv.linux.org.uk> Date: Sun Aug 26 11:01:04 2012 -0400 don't leak O_CLOEXEC into ->f_flags Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
换句话说,你不应该依赖O_CLOEXEC在第一位显示.