码迷,mamicode.com
首页 > 其他好文 > 详细

APUE读书笔记: 文件和目录

时间:2014-11-27 23:34:32      阅读:370      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   ar   color   os   sp   for   strong   

stat, fstat, fstatat 和 lstat函数:

  1. stat函数返回与pathname命名文件相关的信息结构;
  2. fstat函数返回已在文件描述符fd打开文件的相关信息;
  3. lstat函数与stat函数类似,但当命名文件是一个符号链接时,返回该符号链接的相关信息;
  4. fstatat函数为相对于当前打开目录(有fd参数指向)的路径名返回文件统计信息。
  5. struct stat 的具体定义如下图:

bubuko.com,布布扣

文件类型:

  1. 文件类型包括:普通文件,目录文件,块特殊文件,字符特殊文件,FIFO,套接字和符号链接,文件类型由stat结构中的st_mode表示;
  2. 对每个命令行参数打印文件类型:
bubuko.com,布布扣
 1 #include "apue.h"
 2 
 3 int main(int argc, char *argv[])
 4 {
 5     int                i;
 6     struct stat        buf;
 7     char             *ptr;
 8 
 9     for (i = 1; i < argc; i++)
10     {
11         printf("%s: ", argv[i]);
12         if (lstat(argv[i], &buf) < 0) 
13         {
14             err_ret("lstat error");
15             continue;
16         }
17 
18         if (S_ISREG(buf.st_mode))
19         {
20             ptr = "regular";
21         }
22         else if (S_ISDIR(buf.st_mode))
23         {
24             ptr = "directory";
25         }
26         else if (S_ISCHR(buf.st_mode))
27         {
28             ptr = "character special";
29         }
30         else if (S_ISBLK(buf.st_mode))
31         {
32             ptr = "block special";
33         }
34         else if (S_ISFIFO(buf.st_mode))
35         {
36             ptr = "fifo";
37         }
38         else if (S_ISLNK(buf.st_mode))
39         {
40             ptr = "symbolic link";
41         }
42         else if (S_ISSOCK(buf.st_mode))
43         {
44             ptr = "socket";
45         }
46         else {
47             ptr = "** unknown mode **";
48         }
49 
50         printf("%s\n", ptr);
51     }
52 
53     exit(0);
54 }
View Code

 设置用户ID和设置组ID:

  1. 实际用户ID和实际组ID登陆时取自登陆口令;有效用户ID和有效组ID以及附属组ID决定文件访问权限;保存的设置用户ID和保存的设置组ID在执行程序时包含了有效用户ID和有效组ID的副本;
  2. 通常,有效用户ID等于实际用户ID,有效组ID等于实际组ID;
  3. 设置用户ID(set-user-id):当执行此文件时,将进程的有效用户ID设置为文件所有者的用户ID;设置组ID(set-group-id):当执行此文件时,将进程的有效组ID设置为文件所有者的组ID。

新文件和目录的所有权:

  1. 新文件的用户ID设置为进程的有效用户ID;
  2. 对于Linux 3.2.0,默认情况下,新文件的组ID取决于它所在的目录的设置组ID位是否被设置,如果被设置,新文件组ID设置为目录的组ID,否则设置为进程的有效组ID。

函数access和faccessat:

  1. access和faccessat函数是按实际用户ID和实际组ID进行访问权限测试的;
  2. access函数实例:
bubuko.com,布布扣
 1 #include "apue.h"
 2 #include <fcntl.h>
 3 
 4 int main(int argc, char *argv[])
 5 {
 6     if (argc != 2)
 7     {
 8         err_quit("usage: a.out <pathname>");
 9     }
10 
11     if (access(argv[1], R_OK) < 0)
12     {
13         err_ret("access error for %s", argv[1]);
14     }
15     else 
16     {
17         printf("read access ok\n");
18     }
19 
20     if (open(argv[1], O_RDONLY) < 0)
21     {
22         err_ret("open error for %s", argv[1]);
23     }
24     else 
25     {
26         printf("open for reading ok\n");
27     }
28 
29     exit(0);
30 }
View Code

 函数umask:

  1. umask函数为进程设置文件模式创建屏蔽字;
  2. 在文件模式创建屏蔽字中为1的位,在文件mode中相应位一定被关闭(异或);
  3. umask函数实例:
bubuko.com,布布扣
 1 #include "apue.h"
 2 #include <fcntl.h>
 3 
 4 #define RWRWRW (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)
 5 
 6 int main(void)
 7 {
 8     umask(0);
 9     if (creat("foo", RWRWRW) < 0)
10     {
11         err_sys("creat error for foo");
12     }
13 
14     umask(S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
15     if (creat("bar", RWRWRW) < 0)
16     {
17         err_sys("creat error for bar");
18     }
19 
20     exit(0);
21 }
View Code

 函数chmod, fchmod和fchmodat:

  1. chmod, fchmod和fchmodat用于更改文件的访问权限;
  2. chmod实例函数:
bubuko.com,布布扣
 1 #include "apue.h"
 2 
 3 int main(void)
 4 {
 5     struct stat statbuf;
 6 
 7     if (stat("foo", &statbuf) < 0)
 8     {
 9         err_sys("stat error for foo");
10     }
11 
12     if (chmod("foo", (statbuf.st_mode & ~S_IXGRP | S_ISGID)) < 0)
13     {
14         err_sys("chmod error for foo");
15     }
16 
17     if (chmod("bar", S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) < 0)
18     {
19         err_sys("chmod error for bar");
20     }
21 
22     exit(0);
23 }
View Code

 

APUE读书笔记: 文件和目录

标签:style   blog   http   ar   color   os   sp   for   strong   

原文地址:http://www.cnblogs.com/skycore/p/4106674.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!