C - chmod() 不改变权限

Posted

技术标签:

【中文标题】C - chmod() 不改变权限【英文标题】:C - chmod() not changing permissions 【发布时间】:2017-05-08 08:20:37 【问题描述】:

我正在尝试更改位于特定目录中的一堆文件的权限。我正在使用 chmod 这样做。该函数没有返回任何错误,但是当我打印旧权限和新权限时,它看起来并没有改变任何东西。

void main(int argc, char *argv[])
    struct stat archivo;    
    char *directorio = "/home/edu/Escritorio/P7/practica7/prueba";
    char *rutaRel = malloc(strlen(directorio) + 1 + NAME_MAX);
    mode_t permisos;

    modo = strtol(argv[2], NULL, 0);    //I am trying with 0664

    strcpy(rutaRel, directorio);
    rutaRel[strlen(directorio)] = '/';
    while (ep = readdir (dp))
        strcpy(rutaRel + strlen(directorio) + 1, ep->d_name);
        stat(rutaRel, &archivo);
        if(S_ISREG(archivo.st_mode))
            permisos=archivo.st_mode;
            if((chmod(rutaRel,modo))==-1)
                perror("Error: \n");
            
            printf("  %s: %u -> %u\n",ep->d_name,permisos,archivo.st_mode); 
        
       

    closedir(dp);

到目前为止,我无法找到错误。有什么想法吗?

输出:

a4: 33204 -> 33204

a2: 33204 -> 33204

A3:33204 -> 33204

a5: 33204 -> 33204

a1: 33204 -> 33204

【问题讨论】:

如果您使用%o 以八进制打印而不是%u 以十进制打印它们,则权限会更容易理解。您的 archivo 变量在调用 stat() 时捕获权限。它不跟踪chmod() 所做的更改;您必须再次调用stat() 以获取更新后的值。 【参考方案1】:

问题是您没有获得文件的 标志,而是打印了与调用 chmod 之前 相同的旧标志。

【讨论】:

我不太明白。我在“permisos”中保存旧模式,更改权限然后打印文件名,旧模式和新模式,不是吗? @EduardoRamos archivo 没有“跟踪”文件状态 - 您必须在权限更改后再次调用 stat(rutaRel, &archivo); 哦,我明白了。谢谢老兄!

以上是关于C - chmod() 不改变权限的主要内容,如果未能解决你的问题,请参考以下文章

每天一个linux命令(21):chgrp,chown,chmod

linux系列(二十一):chmod命令

文件链接ln,改变文件所有权 chown 和 chgrp,改变文件权限 chmod

java运行shell命令,chmod 777 xxx,改变权限无效的解决的方法。

linux下chmod -x这个命令是有啥作用?

在Linux和Unix中使用chmod命令改变文件权限的用法