3
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. 这对我来说似乎很奇怪!

4

2 回答 2

5

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

于 2013-07-04T12:09:32.733 回答
2

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

于 2013-07-04T12:09:57.810 回答