“Syscall param open(mode)在开放的sys调用中包含未初始化的字节”

时间:2013-07-04 12:06:00

标签: c linux io system-calls

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

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

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