&引用;Syscall param open(mode)包含未初始化的字节;在开放系统调用中

&引用;Syscall param open(mode)包含未初始化的字节;在开放系统调用中,c,linux,io,system-calls,C,Linux,Io,System Calls,运行测试时,我遇到valgrind错误: fd = open(pathname, O_WRONLY | O_LARGEFILE | O_APPEND | O_CREAT); open的返回值为-2 Errno设置为13(权限被拒绝) 路径名缓冲区包含: ==14280== Syscall param open(mode) contains uninitialised byte(s) ==14280== at 0x4111084: open64 (open64.c:42) 有关我的系统的

运行测试时,我遇到valgrind错误:

fd = open(pathname, O_WRONLY | O_LARGEFILE | O_APPEND | O_CREAT);
open
的返回值为
-2

Errno设置为
13(权限被拒绝)

路径名
缓冲区包含:

==14280== Syscall param open(mode) contains uninitialised byte(s)
==14280==    at 0x4111084: open64 (open64.c:42)
有关我的系统的信息:

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
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括

我不明白
模式
如何具有统一化的字节,以及为什么我的
权限被拒绝
。我觉得很奇怪

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

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

谢谢您,caf!我从open(2)中读到:“如果文件不存在,将创建该文件。文件的所有者(用户ID)设置为进程的有效用户ID。组所有权(组ID)设置为进程的有效组ID或父目录的组ID(取决于文件系统类型和装载选项,以及父目录的模式,请参阅装载(8)中描述的装载选项bsdgroups和sysvgroups)。“现在我重新阅读手册页,注意到这样一点:“在flags中指定O_CREAT时必须提供此参数;”-facepalm-
#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>