gpt4 book ai didi

c - C 中 open() 函数中的 "Permission denied"

转载 作者:行者123 更新时间:2023-12-05 08:39:26 26 4
gpt4 key购买 nike

我是 C 编程的新手。我在使用 C 中的 open() 函数写入文件时遇到问题,为了清楚起见,这里是我的代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>

void usage(char *prog_name, char *filename){
printf("Usage: %s <data to add to %s> \n",prog_name, filename);
exit(0);
}

void fatal(char *);
void *errchck_malloc(unsigned int);

int main(int argc, char *argv[]){
int fd; // File descriptor
char *buffer, *datafile;

buffer = (char *) errchck_malloc(100);
datafile = (char *) errchck_malloc(20);
strcpy(datafile, "./simplenote.txt");

if (argc < 2)
usage(argv[0], datafile);

strcpy(buffer, argv[1]);

printf("[DEBUG] buffer @ %p: \'%s\'\n", buffer, buffer);
printf("[DEBUG] datafile @ %p: \'%s\'\n", datafile, datafile);

strncat(buffer, "\n", 1);

// Open file
fd = open(datafile, O_CREAT|O_RDWR,O_APPEND, S_IRUSR, S_IWUSR);
if(fd == -1)
fatal("in main() while opening file");
printf("[DEBUG] file descriptor is %d\n", fd);

// Writing data to file
if(write(fd, buffer, strlen(buffer))==-1)
fatal("in main() while writing buffer to file");

// Closing file
if(close(fd) == -1)
fatal("in main() while closing file");

printf("Note saved\n");
free(buffer);
free(datafile);
}

// fatal(): Function to display error message then exit
void fatal(char *message){
char err_msg[100];

strcpy(err_msg, "[!!] Fatal Error ");
strncat(err_msg, message, 83);
perror(err_msg);
exit(-1);
}

// errchck_malloc(): An error check malloc wrapper function
void *errchck_malloc(unsigned int size){
void *ptr;
ptr = malloc(size);
if(ptr == NULL)
fatal("in errchck_malloc() on memory allocation");
return ptr;
}

当我第一次尝试执行程序时,程序按预期运行。

第一次运行:

user: ./simplenote "Hello, again"
[DEBUG] buffer @ 0x7fafcb4017a0: 'Hello again'
[DEBUG] datafile @ 0x7fafcb401810: './simplenote.txt'
[DEBUG] file descriptor is 3
Note saved

当我尝试打开文件并查看文本时,出现权限被拒绝错误。当我尝试使用 sudo 打开文件时,它打开并且文本在文件中。当我第二次运行该程序时,由于权限问题,我在打开文件时遇到错误。

第二次运行:

user: ./simplenote "just checking if it is still working"                                                           
[DEBUG] buffer @ 0x7face4c017a0: 'just checking if it is still working'
[DEBUG] datafile @ 0x7face4c01810: './simplenote.txt'
[!!] Fatal Error in main() while opening file: Permission denied

如何解决文件创建的权限问题?

最佳答案

程序第一次运行时创建的文件具有不允许您追加的权限

stat simplenote.txt 
File: simplenote.txt
Size: 5 Blocks: 8 IO Block: 4096 regular file
Device: 2fh/47d Inode: 32810078 Links: 1
Access: (2000/------S---) Uid: ( 1000/ user) Gid: ( 1000/ user)
Access: 2020-01-05 19:29:34.317872734 +0100
Modify: 2020-01-05 19:29:34.317872734 +0100
Change: 2020-01-05 19:29:34.317872734 +0100

你应该像这样使用 | 组合模式:

fd = open(datafile, O_CREAT|O_RDWR|O_APPEND, S_IRUSR | S_IWUSR);

你可以使用 man open 检查你应该传递给 open 的参数,在我的系统上它显示了这样的东西(修剪到重要部分):

   int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

int creat(const char *pathname, mode_t mode);

int openat(int dirfd, const char *pathname, int flags);
int openat(int dirfd, const char *pathname, int flags, mode_t mode);

关于c - C 中 open() 函数中的 "Permission denied",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59602852/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com