我尝试编译并运行包含以下行的C代码:
FILE *preproc_producer = NULL;
preproc_producer = tmpfile();
// preproc_producer is not NULL here
preproc_producer = freopen(NULL, "r+", preproc_producer);
// preproc_producer is NULL here
但是,运行代码时,
preproc_producer
最终为NULL
,错误代码为Stale NFS file handle
freopen
调用的目的是什么?我注释掉了freopen
行,该程序的其余部分似乎正在运行。 我正在使用GCC 4.7.2,在Docker 0.6.7 Linux容器中运行Ubuntu 64 12.04。上面的代码似乎在Docker容器之外工作。
更新: strace转储:
stat("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=4096, ...}) = 0
gettimeofday({1385247432, 199732}, NULL) = 0
getpid() = 127
open("/tmp/tmpf9l14HD", O_RDWR|O_CREAT|O_EXCL, 0600) = 3
unlink("/tmp/tmpf9l14HD") = 0
fcntl(3, F_GETFL) = 0x8002 (flags O_RDWR|O_LARGEFILE)
brk(0) = 0xc94000
brk(0xcb5000) = 0xcb5000
fstat(3, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f7afb9d0000
lseek(3, 0, SEEK_CUR) = 0
lstat("/proc/self/fd/3", {st_mode=S_IFLNK|0700, st_size=64, ...}) = 0
munmap(0x7f7afb9d0000, 4096) = 0
open("/proc/self/fd/3", O_RDWR) = -1 ESTALE (Stale NFS file handle)
最佳答案
根据C99标准:
因此,可能是谁编写了这段代码是为了将临时文件打开模式从w+b
更改为r+
(通常归结为将流更改为文本模式)。不幸的是,似乎在您的实现中无法以这种方式更改临时文件的打开模式。
我想这可能是因为关闭临时文件也会将其删除,但也可能是glibc
的freopen
实现不支持freopen
的模式更改(联机帮助页甚至没有提到将NULL
传递为第一个参数)。