使用C在Linux中创建文件

时间:2010-03-07 07:11:03

标签: c

我正在尝试在Linux(Ubuntu)上用C创建一个只写文件。 这是我的代码:

 int fd2 = open ("/tmp/test.svg", O_RDWR|O_CREAT);

 if (fd2 != -1) {
   //....
 }

但为什么我创建的文件有'xr'模式?如何创建它以便我可以在命令提示符下自己打开它?

------xr--  1 michael michael  55788 2010-03-06 21:57 test.txt*
------xr--  1 michael michael   9703 2010-03-06 22:41 test.svg*

2 个答案:

答案 0 :(得分:34)

指定O_CREAT时,您需要open()的三参数形式。当你省略第三个参数时,open()使用恰好在堆栈上的任何值,其中第三个参数是预期的;这很少是一组连贯的权限(在你的例子中,似乎十进制12 =八进制014在堆栈上)。

第三个参数是文件的权限 - 将由umask()值修改。

int fd2 = open("/tmp/test.svg", O_RDWR | O_CREAT, S_IRUSR | S_IRGRP | S_IROTH);

请注意,您可以创建一个没有写入权限的文件(对任何其他人或任何其他进程),同时仍然可以从当前进程写入该文件。很少需要对从程序创建的文件使用执行位 - 除非您正在编写编译器(并且'.svg'文件通常不是可执行文件!)。

S_xxxx标志来自<sys/stat.h><fcntl.h> - 您可以使用任一标头获取信息(但open()本身已在<fcntl.h>中声明。)

请注意,固定文件名和O_EXCL等保护性选项的缺失会使修改后的open()调用有些不安全。

答案 1 :(得分:1)

将访问权限作为第三个参数:

int fd2 = open("/tmp/test.svg", O_RDWR|O_CREAT, 0777);  // Originally 777 (see comments)

if (fd2 != -1) {
    // use file descriptor
    close(fd2);
}

通过执行此操作,将为用户,组和其他人提供所有读取,写入和执行权限。根据您的使用修改第3个参数。