免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1812 | 回复: 3
打印 上一主题 下一主题

[Linux] 请大神帮忙 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-12-31 16:47 |只看该作者 |倒序浏览
代码如下
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main()
{
    write_tgt_id_fzs_no(0,1,0);

    return 0;
}

int write_tgt_id_fzs_no(int tgt_id, int fzs_no, int queue_id)
{
    char filename[8] = {0};
    char buf[32] = {0};
    int fd = -1;
    size_t len = 0;

    snprintf(filename, 8, "conf/%d", queue_id);
    fd = open(filename, O_CREAT|O_TRUNC|O_RDWR, 777);
    if (-1 == fd)
    {
        printf("open %s error\n", filename);
        perror("open");
        return -1;
    }
    snprintf(buf, 32, "%d %d", tgt_id, fzs_no);
    len = write(fd, buf, strlen(buf) + 1);
    if (strlen(buf)+1 != len)
    {
        printf("write fail:%d:%d\n", (int)(strlen(buf)), (int)len);
        perror("write");
        return -1;
    }
    printf("success\n");

    return 0;
}

为什么生成的文件权限是这样的?为什么不是可读可写的权限??请大神指导,谢谢了!
-r----x--t. 1 anxuan anxuan   4 Dec 31 16:42 0
        

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
2 [报告]
发表于 2014-12-31 17:15 |只看该作者
你关注一下umask这个系统调用,有可能是这个原因

论坛徽章:
0
3 [报告]
发表于 2015-01-02 20:38 |只看该作者
本帖最后由 fendounav 于 2015-01-02 21:04 编辑

我试了一下你的程序,下面这句话有点问题:
fd = open(filename, O_CREAT|O_TRUNC|O_RDWR, 777);
第三个参数不要用777,用S_IRUSR|S_IWUSER|S_IXUSR|S_IRGRP|S_IWGRP|S_IXGRP|S_IROTH|S_IWOTH|S_IXOTH试一下。
最后你得到的结果可能还不是你想要的。这时候又跟umask有关系。实际的访问权限由mode &~umask共同确定。

open()函数的第三个参数mode,其取值方法和umask里面不一样。你可以简单的通过 int tmp = S_IRUSR;的方法打印出每个宏定义的值看一下。
S_IRUSR:0x100
S_IWUSER:0x80
S_IXUSR:0x40
S_IRGRP:0x20
S_IWGRP:0x10
S_IXGRP:0x8
'S_IROTH:0x4
S_IWOTH:0x2
S_IXOTH:0x1
上面的值都加上是511,或者0x1FF。

fd = open(filename, O_CREAT|O_TRUNC|O_RDWR, 511);这样是可以的。

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
4 [报告]
发表于 2015-01-05 09:49 |只看该作者
我们在命令行上chmod 777指的是八进制,而代码中的777代表十进制,你改成0777就应该可以了,umask默认是022,所以按照0777创建的文件的权限应该是755
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP