#include<apue.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
int main(int argc , char *argv[])
{
int fd = open("test.txt",O_WRONLY | O_CREAT | O_TRUNC);
int pid,status;
const char *str_for_parent = "str_for_parent\n";
const char *str_for_child = "str_for_child\n";
if ((pid = fork()) < 0)
err_sys("fork error");
else if (pid == 0)
{
write(fd,str_for_child,strlen(str_for_child)+1);
_exit(0);
}
wait(&status);
write(fd,str_for_parent,strlen(str_for_parent)+1);
return 0;
}
test.txt
是由open()创建的。但是它的权限(---------x
)与-rw-rw-r--
或其他任何软件创建的文件(touch
)不同我的system.my umask 是0002
答案 0 :(得分:5)
open
实际上采用了(可选的)第三个参数:
int open(const char *pathname, int flags, mode_t mode);
新文件的模式设置为mode
的AND和umask
的倒数(即mode & ~umask
)。因为你没有传递mode
,所以它被初始化为一些垃圾,结果你得到了错误的模式。
通常,如果您通过O_CREAT
,则应传递mode
0666
,除非您有某些特定原因要使用其他模式(例如,如果您想要确保其他用户无法读取该文件,无论umask设置为什么。)
答案 1 :(得分:2)
如果向O_CREAT
提供open()
标志,则还必须提供第三个mode
参数,该参数与当前umask组合以设置创建文件的权限位。
除非您专门创建可执行文件,否则几乎总是使用0666
作为此参数:
int fd = open("test.txt",O_WRONLY | O_CREAT | O_TRUNC, 0666);
这应该会给您与touch
相同的结果。请注意,C中的前导零表示八进制常量。