【问题标题】:create file with given name and permissions in linux using c使用c在linux中创建具有给定名称和权限的文件
【发布时间】:2018-05-28 14:49:55
【问题描述】:

我必须在 c create 中编写一个带有 2 个参数的函数:文件名和文件权限。 (例如:create("f","rwxr_xr_x") 此函数创建文件 f,该文件将获得 "rwxr_xr_x" 权限并将返回 0)如果文件已存在或无法创建,它将返回一个不同于 0 的数字。 这是我想出的代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

int create(char *name, char *mode)
{
    int fp = fopen(name, "r+");
    if (fp > 0)
    {
        int i, n = 0;
        for (i = 0; i < 9; i = i + 3)
        {
            int nr = 0;
            if (mode[i] == 'r')     nr += 4;
            if (mode[i + 1] == 'w') nr += 2;
            if (mode[i + 2] == 'x') nr += 1;
            n = n * 10 + nr;
        }
        chmod(name, n);
        return 0;
    }
    else
        return -1;
}

int main(int argc, char* argv[])
{
    if (argc != 3) printf("%s\n", "Error: Incomplet number of arguments!");
    int fp;
    fp = create(argv[1], argv[2]);
    if (fp == 0) printf("%s\n", "File successfully created!");
    else printf("%s\n", "Could not create file!");
    return 0;
}

我尝试以 r+ 模式打开文件,然后使用 chmod 更改权限,{不确定这是否正确)。当我编译这个时,我收到以下警告:“初始化从指针中生成整数,而不对行 int fp=fopen(name, r+) 进行强制转换。有人可以帮我解决这个问题并告诉我代码是否正确吗?我是 linux 新手

更新 所以我按照建议进行了一些更改,但我认为它仍然没有提供正确的权限(正如我所说我是 linux 新手,所以我可能错了)。这是我的代码现在的样子:

 #include <stdio.h>
 #include <stdlib.h>
 #include <stdio.h> 
 #include <stdlib.h>
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <fcntl.h>
 int create(char *name, char *mode)
 {
  int i,n=0;
  for(i=0; i<9; i=i+3)
   {
      int nr=0;
      if(mode[i]=='r')   nr+=4;
      if(mode[i+1]=='w') nr+=2;
      if(mode[i+2]=='x') nr+=1;
      n=n*8+nr;
   }   
  int fl=creat(name, n);
  printf("%d\n", n); 
   if(fl>0)
       return 0;
   else return -1;
}

int main(int argc, char* argv[])
{
   if(argc != 3)
      printf("%s\n", "Error: Incomplet number of arguments!");

   int fp;
   fp=create(argv[1], argv[2]);
   if(fp==0) printf("%s\n", "File successfully created!");
   else printf("%s\n", "Could not create file!");
   return 0;
}

另外,如何检查文件是否已经存在?因为在这种情况下,我的函数必须返回一个不同于 0 的值并打印错误消息

【问题讨论】:

  • fopenreturns a FILE * not an int, open return an int
  • @PawanKartik:问题与创建文件而不是目录有关。
  • @Alexandra_p:有什么理由不使用open/creat
  • ITYM n = n * 8 + nr,因为您在那里使用八进制。
  • @TobySpeight 感谢您的建议,我更改了它但仍然不确定它是否有效?

标签: c linux file permissions chmod


【解决方案1】:

首先你对这一行的问题:

int fp=fopen(name, "r+");

fopen 返回一个 FILE * 类型的值,而不是 int,因此该行应该是

FILE *fp=fopen(name, "r+");

这意味着您需要测试fp 是否不是NULL 而不是&gt; 0

创建文件后,您还应该记得调用fclose(fp) 来关闭文件。

您处理权限的代码也是错误的。通常传递给 shell 中chmod 命令的值是八进制,而不是十进制,所以这一行是错误的。

n=n*10+nr;

您希望每次将n 乘以 8。

由于它是一个位字段,您可以通过使用“|=”运算符而不是使用加法来更改适当的位来改进代码。

if(mode[i]=='r')   nr |=4;
if(mode[i+1]=='w') nr |=2;
if(mode[i+2]=='x') nr |=1;

您还应该真正检查以确保该模式在循环之前至少有 9 个字符。

【讨论】:

  • 感谢您的建议。但是为什么要将 n 乘以 8?我知道第二个参数必须是八进制,但是例如如果我们取 rwxrwxrwx n=511,那么第二个参数不应该是 0777 吗?我用 n 乘以 8 对这个示例进行了测试,对于所有者和组,它设置了正确的权限(读取和写入),但对于其他人来说,它似乎是只读的,什么时候它也应该是读取和写入的?
  • @Alexandra_p 如果n 是 511(十进制),那么这与 0777 相同,它是八进制。如果你乘以 10,你会得到 777,即八进制的 1411。
  • 它无法按预期工作的原因是因为该模式受您的 umask 影响 - 您仍然需要执行 chmod 才能获得您想要的实际权限。
猜你喜欢
  • 2017-03-01
  • 2011-08-18
  • 1970-01-01
  • 2016-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-13
  • 2012-03-11
相关资源
最近更新 更多