【问题标题】:O_FLAGS to append or create file. With open() in C unixO_FLAGS 追加或创建文件。在 C unix 中使用 open()
【发布时间】:2017-09-27 18:40:21
【问题描述】:

所以我有以下代码。 str_arr[] 仅包含控制台命令 ex ls、sort.. 和文件名的组合。并且 execute() 派生出一个子进程。

for(int y=0; y<i-1; y++){
    if(type_arr[y]==0){

    }
    else if(type_arr[y]==1){

    }
    else if(type_arr[y]==2){
        int fw1=open(str_arr[y+1], O_WRONLY | O_APPEND | O_CREAT |S_IRWXU);
        int sv_out1=dup(1);
        dup2(fw1, 1);
        close(fw1);
        execute(str_arr[y]);
        dup2(sv_out1, 1);
    }
    else if(type_arr[y]==3){
        int fw=open(str_arr[y+1], O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IRGRP | S_IWGRP | S_IWUSR);
        int sv_out=dup(1);
        dup2(fw, 1);
        close(fw);
        execute(str_arr[y]);
        dup2(sv_out, 1);
    }
}

type_arr[y]==3时,如果文件存在,代码应该创建或覆盖文件。这行得通。但是,当 type_arr[y]==2 代码应该创建或附加文件时,这不起作用,实际上它只会在文件存在时正常打印到控制台(使用 ls),如果文件确实存在它确实创建了一个新文件。这里有什么问题?这些 O_FLAGS 应该附加或创建文件吗?

【问题讨论】:

  • S_IRWXU 在你的开放模式下在做什么?你的错误检查在哪里?
  • S_IRWXU 这样做:00700 用户(文件所有者)具有读、写和执行权限
  • 是的。这些是权限位。为什么将它们作为开放模式的一部分传递?
  • 因为如果也必须创建,当我没有把它创建为只读模式时。
  • 你说不通。现在您已将O_CREAT 添加到打开模式,您还需要第三个参数(新文件的文件权限)。

标签: c linux file unix


【解决方案1】:

要追加或创建文件,请使用:

int fw1=open(str_arr[y+1], O_WRONLY | O_APPEND | O_CREAT, FILE_PERMISSIONS);

并使用第三个参数作为文件权限(例如:FILE_PERMISSIONS = 0777

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-27
    • 2014-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多