- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我尝试编译并运行具有以下几行的 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 标准:
The freopen function opens the file whose name is the string pointed to by filenameand associates the stream pointed to by stream with it. The mode argument is used justas in the fopen function.
If filename is a null pointer, the freopen function attempts to change the mode ofthe stream to that specified by mode, as if the name of the file currently associated withthe stream had been used. It is implementation-defined which changes of mode arepermitted (if any), and under what circumstances.
所以,可能是谁写了这段代码,打算将临时文件打开模式从 w+b
更改为 r+
(主要归结为将流更改为文本模式).不幸的是,在您的实现中似乎无法以这种方式更改临时文件的打开模式。
我想这可能是因为关闭临时文件也会删除它,但也可能是 freopen
的 glibc
实现不支持模式freopen
的更改(联机帮助页甚至没有提到将 NULL
作为第一个参数传递的可能性)。
关于c - 为什么我不能 "freopen" "tmpfile"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20168275/
我有 n 个文件,我的程序需要使用线程和临时文件将所有文件的内容合并到一个文件中(必须使用 tmpfile())。创建线程时,它必须将 2 个文件合并到临时文件 (temp1) 中,然后另一个线程将接
我尝试编译并运行具有以下几行的 C 代码: FILE *preproc_producer = NULL; preproc_producer = tmpfile(); // preproc_produc
我正在开发一个多进程程序,它基本上对 RVB 文件的每一层执行模糊化。 (1 个过程 -> 1 层)。每个子进程都使用函数传送一个临时文件:tmpfile()。每个子进程完成其工作后,主进程必须读取创
这个问题在这里已经有了答案: Is there a way to get the filename from a `FILE*`? [duplicate] (2 个答案) 关闭 6 年前。 tmpf
我有一个图像上传脚本,它以前是有效的。它现在坏了,我已经将问题追溯到一行: $temp = tmpfile(); // $temp === false tmpfile() 函数返回 false。我似乎
快点…… 有没有办法检索由 tmpfile() 创建的文件的路径? 或者我需要自己用 tempnam() 做吗? 最佳答案 好像stream_get_meta_data()也有效: $tmpHandl
在 Jboss 5.1 上部署 EAR 时出现以下异常 java.io.IOException: tmpFile.renameTo(classFile) failed org.apache.j
我的目标是将一个 .exe 文件包装在另一个 .exe 文件中。每当包装器 .exe 启动时,嵌入的 .exe 应该启动。我已将二进制文件添加为资源。现在我想将文件作为 tmpfile 加载并使用 s
tmpfile 中的安全漏洞是什么?以及如何tmpfile_s解决了吗? 最佳答案 在这种情况下,它似乎属于 Windows CRT 升级的“增强型错误报告”类别。在这种情况下,它基本上意味着它将返回
我对这段代码有疑问: file = tempfile.TemporaryFile(mode='wrb') file.write(base64.b64decode(data)) file.flush()
在 Windows 7 x64 上运行以下代码 #include #include int main() { int i; FILE *tmp; for (i = 0; i
最近,我开始在 JBOss 4.0.5 JSP 应用程序中遇到奇怪的行为。 JSP 编译在第一次(第二次、第三次……)尝试时失败,并出现异常: 17:24:29,909 ERROR [[jsp]] S
在 Windows 7 x64 上运行以下代码 #include #include int main() { int i; FILE *tmp; for (i = 0; i
如何在不使用 tmpnam() 的情况下通过调用 tmpfile() 在 Windows 上获取文件名? std::FILE* tmpf = std::tmpfile(); // Opens a
我正在使用 std::tmpfile() 创建临时文件,但我想使用/tmp 以外的位置。我正在导出 $TMPDIR 以指向新位置,但 std::tmpfile() 没有选择新位置。 如何在/tmp 以
我正在使用 Jetty 6 服务器,有时会出现此异常: java.io.IOException: tmpFile.renameTo(classFile) failed at org.apach
我使用的程序在使用 tmpfile() 时失败了对于大文件。问题似乎是我没有在/tmp 中创建大文件的权限,此函数默认使用该权限。那么有没有一种方法,也许使用环境变量,可以让 tmpfile() 写入
我正在尝试在 Windows 下使用 generateDS,它使用 os.tmpfile。不幸的是,os.tmpfile 对我不起作用: (oneclickcos) C:\Users\Marcin\D
我想打开一个外部配置文件并在编辑器中将其呈现给用户。 我想到的解决办法是创建一个临时文件,把原文件的内容复制到里面。然后将在默认编辑器中打开临时文件供用户编辑。这一切都已完成,因为不应该将不正确的配置
$ man tmpfile说 The standard does not specify the directory that tmpfile() will use. Glibc will try t
我是一名优秀的程序员,十分优秀!