【问题标题】:"can’t open /tmp/ccRBTake.s for writing", while compiling with gcc“无法打开 /tmp/ccRBTake.s 进行写入”,同时使用 gcc 编译
【发布时间】:2013-03-22 07:12:11
【问题描述】:

在编译以下代码时出现异常的编译时错误:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
    if (open("b.txt", O_CREAT | O_RDWR | O_TRUNC, 0777) < 0) {
        perror("open error:");
        exit(1);
    }
    return 0;
}

在不包含 b.txt 的目录中。
以下是错误:

test.c:1:0: fatal error: can’t open /tmp/ccrlx6NY.s for writing: Permission denied
compilation terminated.
The bug is not reproducible, so it is likely a hardware or OS problem.

我正在使用GNU/Linux (3.2.0-39-generic) 操作系统和gcc 编译器版本4.6.3。

$df
Filesystem     1K-blocks      Used Available Use% Mounted on
/dev/sda5       44240004  10753148  31239588  26% /
udev             1004132         4   1004128   1% /dev
tmpfs             406548      1228    405320   1% /run
none                5120         0      5120   0% /run/lock
none             1016364       236   1016128   1% /run/shm
/dev/sda7       80731936  47718056  28912916  63% /home

我收到此消息的确切原因可能是什么?

PS:我现在实际上在我编译的每个文件上都会收到此错误。

【问题讨论】:

  • 你可以试试chmod +w /tmp 并重新运行编译吗?
  • @Ganesh 我试过chmod 仍然给出同样的错误。
  • 你能告诉我们你编译调用的完整命令行吗?
  • @PatrickB.: $gcc test.c
  • 你可以试试gcc -o mytest test.c一次吗?

标签: c unix


【解决方案1】:

尝试使用 TMPDIR 环境变量强制另一个 tmp-dir:

mkdir ~/tmp
export TMPDIR=~/tmp
gcc test.c -o mytest

并检查您的 umask 值。试试

umask 022

并再次调用您的编译调用。

【讨论】:

  • 问题已经解决了,我系统上的umask不知何故设置为0777。但是为什么我能够创建文件,但是gcc被拒绝了?
【解决方案2】:

gcc 的 C 编译器输出程序集,该程序集被写入一个临时文件(扩展名为 .s),然后传递给汇编程序。这里的问题是你没有 /tmp 的写权限,所以它不能写那些文件。

您可以通过TMPDIR环境变量指定gcc使用哪个目录来存储临时文件。

【讨论】:

    【解决方案3】:

    检查您是否具有对 /tmp 目录的写入权限。还要检查它是否未满(尽管考虑到错误消息,这不太可能)。

    你能手动创建/tmp/ccrlx6NY.s吗?

    【讨论】:

    • 是的,我可以访问 /tmp 目录。
    • @mohit:你能手动创建/tmp/ccrlx6NY.s吗?
    • 是的,我可以手动创建/tmp/ccrlx6NY.s
    【解决方案4】:

    您没有写入 /tmp 的权限。 chmod 或要求管理员更改 /tmp 中的权限。

    【讨论】:

    • 我已经在 /tmp 中写入权限,因为我可以创建文件。
    • 作为同一用户登录进行编译?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多