【问题标题】:Trying to implement append in my own shell Linux试图在我自己的 shell Linux 中实现 append
【发布时间】:2021-12-27 16:45:53
【问题描述】:

我正在尝试在我自己的 shell 中实现 append 命令。 我成功追加到现有文件,但每当我尝试追加到文件不存在时,它会在没有任何权限的情况下生成文件(不读取也不写入)

   if (append) {
        fd = open(outfile,'a'); 
        lseek(fd,0,SEEK_END);
        close (STDOUT_FILENO) ; 
        dup(fd); 
        close(fd); 
        /* stdout is now appended */
    } 

我应该怎么做才能使文件具有权限 ?

【问题讨论】:

  • 基本调用是:fd = open(outfile,O_WRONLY | O_CREAT | O_APPEND,0644);。不需要lseek。而且,为了安全起见,我会使用dup2

标签: c linux shell


【解决方案1】:

open() 系统调用不使用字符常量来指示“追加”。阅读 open() 的 POSIX 规范 - 并查看 O_APPEND 等。除了 O_APPEND 之外,您还需要更多的标志,如果您想在文件不存在时创建文件,则需要三个参数给 open()O_CREAT)等

if (append)
{
    fd = open(outfile, O_CREAT|O_APPEND|O_WRONLY, 0644);
    if (fd < 0)
        …deal with error…
}

您可以将0644 写为S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH,但八进制更短并且(经过 30 多年的练习)更易于阅读。您可以根据需要为组(S_IWGRP)和其他人(S_IWOTH)添加写权限(八进制的0666),但除非您知道您希望组成员和其他人修改文件,否则省略会更安全那些——尽管它违背了历史先例。用户可以并且应该将 shell umask 值设置为 022 以防止组和其他人默认能够写入文件,但如果没有它,安全也没有任何危害 (IMO)。

【讨论】:

    猜你喜欢
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    相关资源
    最近更新 更多