2
#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文件() 不同。我的umask-rw-rw-r--touch0002

4

2 回答 2

5

open实际上需要一个(可选的)第三个参数:

int open(const char *pathname, int flags, mode_t mode);

新文件的模式设置为您的(即)的 ANDmode和倒数。由于您没有通过,它会被初始化为一些垃圾,因此您会得到错误的模式。umaskmode & ~umaskmode

通常,如果您要通过O_CREAT,则应该通过 a modeof 0666,除非您有特定原因使用其他模式(例如,如果您想确保文件不被其他用户读取,而不管 umask 设置为什么) .

于 2012-10-04T06:37:19.657 回答
2

如果将O_CREAT标志提供给open(),则还必须提供第三个mode参数,该参数与当前 umask 组合以设置创建文件的权限位。

除非您专门创建可执行文件,否则您几乎应该始终使用0666此参数:

int fd = open("test.txt",O_WRONLY | O_CREAT | O_TRUNC, 0666);

这应该会给您与您看到的相同的结果touch。请注意,C 中的前导零表示八进制常数。

于 2012-10-04T06:37:12.073 回答