如何在 C 中最近创建的文件夹和文件中具有读取权限?
Posted
技术标签:
【中文标题】如何在 C 中最近创建的文件夹和文件中具有读取权限?【英文标题】:How to have read permission in a recent created folder and file in C? 【发布时间】:2010-09-23 10:16:28 【问题描述】:我创建了一个文件夹,并在我打开该文件夹内的文件后对其进行写入。 碰巧在那之后我尝试打开文件但我没有权限因此我必须手动更改它。
/* 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;
为了获得打开创建的文件的权限,我应该更改什么?
非常感谢,
:s
with = 0_CREATE 我仍然有没有权限读取文件的问题。 我必须手动设置它们
我已经有 0_CREAT 了
打开(str1,O_RDWR | O_CREAT | O_TRUNC);
【问题讨论】:
您应该检查 mkdir() 系统调用的返回状态;它可能会失败。目前尚不清楚为什么 filefd 会是负面的,但这是代码片段问题的一部分,而不是完整(非)工作示例。 您还应该检查 open() 系统调用的返回状态;它可能会失败。我还在 open() 调用后发现 memcpy() 操作难以理解。 【参考方案1】:您忘记了open()
的第三个参数。
open()
和 O_CREAT
的第三个参数正是新创建的文件将拥有的权限。
参考资料:
http://www.opengroup.org/onlinepubs/009695399/functions/open.html【讨论】:
【参考方案2】:CesarB 试图告诉您的是,您需要提供权限作为第三个参数:
filefd = open (str1, O_RDWR | O_CREAT | O_TRUNC, 0777);
请使用“添加评论”来回复,而不是为您自己的问题创建新的回复。
【讨论】:
【参考方案3】:安全问题
问题对目录使用了 0777 权限 - 不要! 在一般情况下,您不应该创建具有 0777 权限的目录。您可以考虑使用 01777,就像在 /tmp
上找到的那样;粗略地说,这确保了从目录中删除文件的人有权修改文件。但是您不应该授予每个人从目录中删除任何文件的权限。并声称umask
设置将保护您,虽然可能是正确的,但仍然不是搞乱那些不知道如何安全设置它的人的生活的好借口。使用 0755 或 0775 但不要使用 0777。
其中一个答案对文件使用 0777 权限 - 不要! 该参数类似于目录参数,但需要注意的是大多数人在创建文件时不会创建可执行文件(链接器编写器将是此一般规则的一个例外),并且无论生成的文件是否是可执行的,允许任何人修改程序仍然是一个非常糟糕的主意。使用 0644 或 0664;很少有使用 0666 的充分理由,更不用说使用 0777 的充分理由。
【讨论】:
umask 的全部意义在于您可以在 open()/mkdir() 上使用 0666/0777 并且用户想要的权限(例如,组可写与否)将得到尊重。不知道如何安全设置 umask 的人很可能会将其设置为默认 0022 或 0002。 这取决于系统;除非您将其设置为其他值,否则许多 Unix 都使用 umask 0 分发。在 mkdir() 上,我将允许 0777,但反对它。在 open() 上,很少有充分的理由使用 0777;我会允许 0666,但也反对它。我认为可公开写是一种糟糕、糟糕、糟糕、糟糕的默认设置。【参考方案4】:问题是您使用了错误的路径分隔符 - 您尝试使用反斜杠 '\\'
来分隔组件。这是 Windows 的路径分隔符。由于您使用的是基于 *nix 的操作系统,因此您应该使用正斜杠 '/'
作为路径分隔符。事实上,即使在 Windows 上,您也应该使用正斜杠,因为它更便于移植 - Windows 会自动将正斜杠转换为反斜杠。
因此,您尝试在当前目录中创建一个名为“foo\bar”的文件,这可能会失败,因为您没有在当前目录中创建文件的权限。
【讨论】:
以上是关于如何在 C 中最近创建的文件夹和文件中具有读取权限?的主要内容,如果未能解决你的问题,请参考以下文章