我的目的是打开两个文件,其中第二个文件是全新的,与第一个文件的权限相同。所以为了测试我的代码,我把第一个文件的权限改为 "777"。然后我继续运行我的程序。令我惊讶的是,新生的文件2的权限是错误的!它们被设置为755。它们的权限被设置为755。更奇怪的是,当我把第一个文件设置为 "111 "并再次尝试时,结果现在是 "1204"。
下面是我的代码
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
int main(int argc, char *args[]) {
struct stat stats;
int fd1, fd2;
fd1 = open("testfile.txt", O_RDONLY);
/* Error check*/
if (fd1 == -1) {
/* Error handling */
perror("Opening");
printf("Unable to open file: %s\n", "testfile.txt");
printf("ERROR: %s\n", strerror(errno));
return 1;
}
if(fstat(fd1, &stats) == -1)
{
printf("Error while getting stats: %s\n", strerror(errno));
exit(-1);
}
//Receives the output file as a main argument . . .
if (argc > 1)
{
//(stats.st_mode = Gets the mask of the first file)
fd2 = open(args[1], O_WRONLY|O_CREAT, stats.st_mode);
/* Error check*/
if (fd2 == -1) {
/* Error handling */
perror("Opening");
printf("Unable to open file: %s\n",args[1]);
printf("ERROR: %s\n", strerror(errno));
return 1;
}
}
//. . . if it doesn't it creates a standard one warning you about it
else
{
fd2 = open("Nope.txt", O_WRONLY|O_CREAT, stats.st_mode);
/* Error check*/
if (fd2 == -1) {
/* Error handling */
perror("Opening");
printf("Unable to open file: %s\n",args[1]);
printf("ERROR: %s\n", strerror(errno));
return 1;
}
printf("Standard file created\n");
}
close(fd1);
close(fd2);
return 0;
}
我试着让它尽可能的整洁:)
在open(2)的man page中,关于O_CREATE的部分。
进程的umask会以通常的方式修改有效模式:在没有默认ACL的情况下,创建文件的模式是(mode & ~umask)。
如果你输入 umask
在bash中,你可以看到你提供的模式中使用的是什么值和哪些位被清除。