【问题标题】:"Syscall param open(mode) contains uninitialised byte(s)" in open sys call“系统调用参数打开(模式)包含未初始化的字节”在打开系统调用
【发布时间】:2013-07-04 12:06:00
【问题描述】:
fd = open(pathname, O_WRONLY | O_LARGEFILE | O_APPEND | O_CREAT);

在运行我的测试时,我遇到了一个 valgrind 错误:

==14280== Syscall param open(mode) contains uninitialised byte(s)
==14280==    at 0x4111084: open64 (open64.c:42)

open的返回值为-2

Errno 设置为13 (Permission denied)

pathname 缓冲区包含:

0x68
0x72
0x32
0x2E
0x66
0x61
0x0 

关于我的系统的信息:

$ ls -la
drwxr-xr-x 7 rzetterberg zed 4096 Jul  4 13:56 .
$ id
uid=1000(rzetterberg) gid=1000(rzetterberg) groups=1000(rzetterberg), ... etc
$ sudo file -Ls /dev/sda1
/dev/sda1: sticky Linux rev 1.0 ext3 filesystem data, UUID=XXXX (needs journal recovery) (large files)
$ uname -a
Linux xxxx 3.2.0-4-686-pae #1 SMP Debian 3.2.46-1 i686 GNU/Linux

包含的标题:

#include <stdio.h>
#include <stdint.h>
#include <assert.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

我不明白mode 是如何具有单元化字节的,以及为什么我会得到Permission denied。这对我来说似乎很奇怪!

【问题讨论】:

    标签: c linux io system-calls


    【解决方案1】:

    如果将O_CREAT 标志提供给open(),则必须提供第三个参数。这是一个整数,表示应用于创建文件的权限(由当前umask修改)。

    【讨论】:

    • 谢谢你,咖啡馆!我从 open(2) 中读到:“如果文件不存在,它将被创建。文件的所有者(用户 ID)设置为进程的有效用户 ID。组所有权(组 ID)是设置为进程的有效组 ID 或父目录的组 ID(取决于文件系统类型和挂载选项,以及父目录的模式,请参阅 mount(8) 中描述的挂载选项 bsdgroups 和 sysvgroups )。”
    • 现在我重新阅读了手册页,我注意到了这一点:“在标志中指定 O_CREAT 时必须提供此参数;” -facepalm-
    【解决方案2】:

    当您使用O_CREAT 调用open 时,您需要系统调用的第三个参数。该参数称为mode。 Valgrind 报告未初始化的字节,因为它不知道您没有指定参数,但它发现堆栈上发生的任何事情都不是它所期望的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-30
      • 2013-10-15
      • 1970-01-01
      • 2017-06-26
      • 2011-05-12
      • 1970-01-01
      • 2018-01-06
      • 2014-06-29
      相关资源
      最近更新 更多