在C中没有写权限的情况下写入文件?

时间:2015-07-22 10:03:10

标签: c

我想创建一个文件,该文件没有这样的写权限。

#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 甚至无法在第一次(创建时)写入。

2 个答案:

答案 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_WRONLYO_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"); } 有效,那么该文件始终为空且只读,没有任何意义。