我想创建一个文件,该文件没有这样的写权限。
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
main()
{
int fd;
fd=open("xxx",O_CREAT|O_WRONLY|O_APPEND,S_IRUSR);
if(fd==-1)
return 0;
else
if(write(fd,"created",7)==-1)
return 0;
if(close(fd)==-1)
return 0;
printf("OK");
}
我运行了可执行文件并注意到可以写入 xxx 文件。对于cource来说,当我第一次运行可执行文件时,它就像我预期的那样无法写入。
但是如何使文件 xxx 甚至无法在第一次(创建时)写入。
答案 0 :(得分:2)
你应该删除:
O_WRONLY
看起来应该是这样的:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main(void){
int fd;
fd=open("test.sh",O_CREAT|O_APPEND,S_IRUSR);
if(fd==-1)
return 0;
else
if(write(fd,"created",7)==-1)
return 0;
if(close(fd)==-1)
return 0;
printf("OK");
return 0;
}
如果您尝试编写该文件,您将获得:
[ Error writing test.sh: Permission denied ]
无论如何,在我的Linux机器上如果我想检查那个文件,我会这样做:
#include <stdio.h>
#include <stdlib.h>
#include<unistd.h>
void fileCheck(const char *fileName){
if(!access(fileName, F_OK )){
printf("The File %s\t Found\n",fileName);
}else{
printf("The File %s\t not Found\n",fileName);
exit(1);
}
if(!access(fileName, R_OK )){
printf("The File %s\t can be read\n",fileName);
}else{
printf("The File %s\t cannot be read\n",fileName);
}
if(!access( fileName, W_OK )){
printf("The File %s\t it can be Edited\n",fileName);
}else{
printf("The File %s\t it cannot be Edited\n",fileName);
}
if(!access( fileName, X_OK )){
printf("The File %s\t is an Executable\n",fileName);
}else{
printf("The File %s\t is not an Executable\n",fileName);
}
}
int main (void){
char *fileName = "test.sh";
fileCheck(fileName);
return 0;
}
输出结果说:
The File test.sh Found The File test.sh can be read The File test.sh it cannot be Edited The File test.sh is not an Executable
答案 1 :(得分:1)
我能理解作者的意图。他想测试S_IRUSR
的用法。我将解释为什么它第一次不起作用。
首先让我们解决您的问题。您只需删除O_WRONLY
和O_APPEND
标记,然后添加O_RDONLY
标记即可。代码如下:
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
int main() {
int fd;
fd = open("xxx", O_CREAT|O_RDONLY, S_IRUSR);
// or
// fd = open("xxx", O_CREAT, S_IRUSR);
if (fd == -1) {
printf("open failed\n");
return 0;
} else {
if (write(fd, "created", 7) == -1) {
printf("write failed\n");
return 0;
}
}
if (close(fd) == -1) {
printf("close failed\n");
return 0;
}
printf("OK\n");
}
然后执行程序,它总是说“写入失败”,“xxx”为空。
你说:$ ls
test.c的
$ make test
cc test.c -o test
$ ls
test test.c
$ ./test
写失败
$ ls
test test.c xxx
$ cat xxx
$ ./test
写失败
事实上,如果使用你的代码,第一次运行后,它就不能被写入,它不会被打开。对于cource来说,当我第一次运行可执行文件后,它就像我预期的那样无法写入。
$ ls
test test.c
$ ./test
OK
$ ls
test test.c xxx
$ cat xxx
创建
$ ./test
打开失败
然后让我们面对更重要的问题,为什么S_ISUSR
第一次不起作用。让我们运行'man 2 open',它说:
请注意,此模式仅适用于将来访问新创建的文件;创建只读文件的open()调用可能会返回一个读/写文件描述符。
这意味着S_ISUSR
仅在第一次之后有效。即使S_ISUSR
是只读的,但实际上仍然返回读/写权限,最终权限取决于标志,如果标志是O_WRONLY
,它只能在创建时写入,如果标志是{ {1}},它只能在创建时读取。
让我们做一个测试:
O_RDONLY
并且结果是第一次,当文件创建时,如果具有写入权限且没有读取权限,则在第一次之后,它打开失败:
$ ls
test.c的
$ make test
cc test.c -o test
$ ./test
读取失败
$ ./test
打开失败了 $ cat xxx
创建了
我可以理解为什么他们设计模式参数只能在第一次工作后才能工作。您认为,如果文件创建时#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
int main() {
int fd;
char buf[10];
fd = open("xxx", O_CREAT|O_WRONLY, S_IRUSR);
if (fd == -1) {
printf("open failed\n");
return 0;
} else {
if (write(fd, "created", 7) == -1) {
printf("write failed\n");
return 0;
}
}
if (read(fd, buf, 7) == -1) {
printf("read failed\n");
return 0;
} else {
printf(buf);
}
if (close(fd) == -1) {
printf("close failed\n");
return 0;
}
printf("OK\n");
}
有效,那么该文件始终为空且只读,没有任何意义。