第四章 文件和目录 (二)

umask

 

为进程设置文件方式创建屏蔽字,也就是说umask一个权限后进程就会取消它

 

//屏蔽权限测试--------------4_3.c----------------

 

#include <sys/types.h>

 

#include <sys/stat.h>

 

#include <fcntl.h>

 

#include "ourhdr.h"

 

#include "err_error.h"

 

int main(void)

 

{

 

       umask(0);

 

       if(creat("foo",S_IRUSR | S_IWUSR | S_IRGRP |S_IWGRP |

 

                                   S_IROTH | S_IWOTH)<0)//生成foo,权限为用户读写,组读写,其他读写

 

              err_sys("creat error for foo");

 

 

 

       umask(S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); //屏蔽组读写,其他读写

 

      

 

       if(creat("bar",S_IRUSR | S_IWUSR | S_IRGRP |S_IWGRP |

 

                                   S_IROTH | S_IWOTH)<0)//被屏蔽了一些权限

 

              err_sys("creat error for bar");

 

       exit(0);

 

}

 

//----------------------end-----------------------

 

 

 

king@king-laptop:~/programe/UNIX/4$ gcc -o 4_3 4_3.c

 

king@king-laptop:~/programe/UNIX/4$ ./4_3 ;ls -l foo bar

 

-rw------- 1 king king 0 2009-02-07 13:00 bar     创建bar时的creat与创建foo时的是一样的,只是被屏蔽掉了一部分

 

-rw-rw-rw- 1 king king 0 2009-02-07 13:00 foo

 

king@king-laptop:~/programe/UNIX/4$

 

 

 

 

 

chmod,fchmod

 

改变文件的存取许可权

 

 

 

//---------------------4_4.c----------------------------

 

#include <sys/types.h>

 

#include <sys/stat.h>

 

#include <fcntl.h>

 

#include "ourhdr.h"

 

#include "err_error.h"

 

int main(void)

 

{

 

       int fd;

 

       if(chmod("foo",S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)<0);//改为用户读,用户写,组读,其他读

 

       if((fd=open("bar",O_RDWR))==-1)

 

              err_sys("open error");

 

       if(fchmod(fd,S_IRUSR | S_IWUSR )<0)//改为用户读,用户写

 

              err_sys("chmod error for bar");

 

       exit(0);

 

}

 

//-------------------------end-------------------------

 

king@king-laptop:~/programe/UNIX/4$ gcc -o 4_4 4_4.c

 

king@king-laptop:~/programe/UNIX/4$ ls -l bar foo

 

-rw------- 1 king king 0 2009-02-07 13:00 bar

 

-rw-rw-rw- 1 king king 0 2009-02-07 13:00 foo

 

king@king-laptop:~/programe/UNIX/4$ ./4_4 ; ls -l bar foo

 

-rw------- 1 king king 0 2009-02-07 13:00 bar            嘿,看到了吗?

 

-rw-r--r-- 1 king king 0 2009-02-07 13:00 foo

 

king@king-laptop:~/programe/UNIX/4$

 

 

 

chown,fchown,lchown

 

改变文件的用户ID和组ID,书上说只有超级用户才可使用,我没做过,试试吧

 

//-----------------chown.c--------------------------

 

#include <sys/types.h>

 

#include <unistd.h>

 

#include "ourhdr.h"

 

#include "err_error.h"

 

main()

 

{

 

       if(chown("chown.c",0,0)==-1)//把自己的文件改成root

 

              err_sys("chown error");

 

}

 

//-----------------------end------------------------

 

king@king-laptop:~/blog$ gcc -o chown chown.c

 

king@king-laptop:~/blog$ ls -l chown.c

 

-rw-r--r-- 1 king king 183 2009-02-07 13:32 chown.c

 

king@king-laptop:~/blog$ ./chown      //呜呜,一般用户就是不能用啊

 

chown error: Operation not permitted

 

king@king-laptop:~/blog$ sudo ./chown ; ls -l chown.c

 

-rw-r--r-- 1 root root 183 2009-02-07 13:32 chown.c

 

king@king-laptop:~/blog$

 

 

 

 

 

truncate,ftruncate

 

文件截短,保留头部length字节

 

//--------------------truncate.c---------------------

 

#include <sys/types.h>

 

#include <sys/stat.h>

 

#include <fcntl.h>

 

#include <unistd.h>

 

#include "ourhdr.h"

 

#include "err_error.h"

 

main()

 

{

 

       char line[MAXLINE]="Hello world!/n";

 

       int fd;

 

       if((fd=creat("234",0666))==-1)

 

              err_sys("creat error");

 

       if(write(fd,line,13)!=13)

 

              err_sys("write error");

 

       close(fd);

 

 

 

       system("cat 234");

 

 

 

       if(truncate("234",5)==-1)  //我们只保留Hello

 

              err_sys("trucate error");

 

 

 

       system("cat 234");

 

 

 

       exit(0);

 

}

 

//-------------------------end---------------------------

 

king@king-laptop:~/blog$ gcc -o truncate truncate.c

 

king@king-laptop:~/blog$ ./truncate

 

Hello world!

 

Helloking@king-laptop:~/blog$    //看到了吗,由于没有'/n',所以没有换行

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值