1

我创建了一个文件夹,在我打开该文件夹内的文件后,在其上写入。碰巧在那之后我尝试打开文件但我没有权限因此我必须手动更改它。

/* str1 has tha name of the folder */
/* str the bytes I want to write in the file inside the folder*/
...

   mkdir(str1,0777);    
   if (filefd < 0) { 

      strncpy(auxstr, str, MAX_MSG + 1);
      strcat(str1,"\\");
      strcat(str1, auxstr);
      filefd = open (str1, O_RDWR | O_CREAT | O_TRUNC);

      nbytes -= (strlen(str) + 1);
      memcpy(auxstr, &str[strlen(str)+1], nbytes); 
      memcpy(str, auxstr, nbytes);

   }

   /*write to the file */
   if ((nwritten = write(filefd, str, nbytes)) != nbytes) {
       printf ("can't write on file\n");
       break;
   }

为了获得打开创建的文件的权限,我应该更改什么?

非常感谢,


:秒

with = 0_CREATE 我仍然有没有权限读取文件的问题。我必须手动设置它们


而且我已经有 0_CREAT 在公开

打开(str1,O_RDWR | O_CREAT | O_TRUNC);

4

4 回答 4

5

您忘记了 的第三个参数open()

open()with的第三个参数O_CREAT正是新创建的文件将拥有的权限。

参考:

于 2008-11-21T10:37:03.777 回答
3

安全问题

该问题对目录使用 0777 权限-不要! 在正常情况下,您不应该创建具有 0777 权限的目录。您可能会考虑使用 01777 ,就像您在/tmp; 粗略地说,这确保了从目录中删除文件的人有权修改文件。但是您不应该授予每个人从目录中删除任何文件的权限。并声称该umask设置将保护您,虽然可能是正确的,但仍然不是搞乱那些不知道如何安全设置它的人的生活的好借口。使用 0755 或 0775 但不要使用 0777。

答案之一是对文件使用 0777 权限-不要! 该参数类似于目录参数,但需要注意的是大多数人在创建文件时不会创建可执行文件(链接器编写器将是此一般规则的例外),并且无论生成的文件是否是可执行的,允许任何人修改程序仍然是一个非常糟糕的主意。使用 0644 或 0664;很少有使用 0666 的充分理由,更不用说使用 0777 的充分理由。

于 2008-11-25T05:32:14.267 回答
3

CesarB 试图告诉您的是,您需要提供权限作为第三个参数:

filefd = open (str1, O_RDWR | O_CREAT | O_TRUNC, 0777);

请使用“添加评论”来回复,而不是为您自己的问题创建新的回复。

于 2008-11-21T12:09:22.737 回答
0

问题是您使用了错误的路径分隔符 - 您正在尝试使用反斜杠'\\'来分隔组件。这是 Windows 的路径分隔符。由于您似乎使用的是基于 *nix 的操作系统,因此您应该使用正斜杠'/'作为路径分隔符。事实上,即使在 Windows 上,您也应该使用正斜杠,因为它更便于移植 - Windows 会自动将正斜杠转换为反斜杠。

结果,您尝试在当前目录中创建一个名为“foo\bar”的文件,这可能会失败,因为您没有在当前目录中创建文件的权限。

于 2008-11-25T16:38:08.883 回答