unix/linux文件属性及其系统调用

Linux技术    2011-09-19 19:48  

  TABLE 1. 获取文件属性(stat,fstat,lstat)

  2. 文件类型2.1 文件类型包括一下几种2.2 文件类型测试的宏2.3 文件类型测试实例3. 文件的权限3.2 关于权限的小细节3.3 设置用户ID和设置组ID 3.4 文件权限操作的系统调用3.4.1 umask函数3.4.2 chmod和fchmod 3.4.3 chown fchown和lchown 4. 文件的时间4.1 utime函数

  文件有其属性,如类型,权限,长度,状态等,本文将对此进行总结,同时学习相关的系统调用。

  1. 获取文件属性(stat,fstat,lstat)

  三个stat函数能够返回文件的信息。

  [code] #include

  int stat(const char *pathname, struct stat *buf);int fstat(int filedes, struct stat *buf);int lstat(const char *pathname, struct stat *buf);返回值:成功 0失败 -1 [/code]

  三个函数的区别是,stat 第一个参数是文件名,fstat 第一个参数文件描述符,lstat 第一参数是文件名,且他返回的是符号链接的信息,而不是符号链接引用文件的信息。

  第二个参数buf结构体指针,是一个我们必须提供的结构。其基本的形式:struct stat { mode_t st_mode; /* 文件类型和文件权限 */ ino_t st_ino; /* 与该文件关联的inode */ dev_t st_dev; /* 保存的文件设备 */ nlink_t st_nlink; /* 该文件上硬链接的个数 */ uid_t st_uid; /* 文件属主UID */ gid_t st_gid; /* 文件属主GID */ off_t st_size; /* 文件字节数,普通文件有效 */ time_t st_atime; /* 文件上一次被访问的时间 */ time_t st_mtime; /* 文件内容上一次被修改的时间 */ time_t st_ctime; /* 文件权限、属主、组或内容上一次被修改的时间 */ }使用stat函数最多的可能是`ls -l`命令,来获取一个文件的所有信息。下面我们就按照stat的内容来了解文件属性信息。

  2. 文件类型结构体stat的st_mode里就有文件类型的信息(st_mode同时包含文件类型和文件权限)。

  2.1 文件类型包括一下几种1. 普通文件/regular file.最长用的文件类型。数据可以是文本也可以是二进制文件,对unix内核来说没有区别。

  2. 目录文件/directory file.这种文件包含了其他文件的名字和指向这些文件有关信息的指针。

  3. 块特殊文件/block special file.这种文件类型提供对设备带缓冲的访问。每次访问以固定长度为单位进行。

  4. 字符特殊文件/ character special file这种文件类型提供对设备不带缓冲的访问。每次访问长度可变。

  5. FIFO这种类型文件用于进程间通信,也成为命名管道。

  6. 套接字 / socket这种文件类型用于进程间的网络通信。

  7. 符号链接 / sysbolic link这种类型文件指向另一个文件。

  2.2 文件类型测试的宏对于一个文件,可以用下面的宏来确定文件类型。这些宏的参数是 stat中的st_mode成员。

  S_ISREG() 测试是否是普通文件S_ISDIR() 测试是否是目录文件S_ISBLK() 测试是否是块特殊文件S_ISCHR() 测试是否是字符特殊文件S_ISFIFO() 测试是否管道S_ISSOCK() 测试是套接子S_ISLNK() 测试是否是链接文件

  2.3 文件类型测试实例[code] filename: file_type.c #include #include #include #include

  int main(int argc, char *argv[])

  { int ret;int i;struct stat stat_buf;char *p_file_type;

  for (i = 1; i < argc; i++) { if ((ret = lstat(argv[i], &stat_buf)) == -1) { fprintf(stderr, "%s ——> lstat error!\n", argv[i]);continue;} if (S_ISREG(stat_buf.st_mode))

  p_file_type = "regular";else if (S_ISDIR(stat_buf.st_mode))

  p_file_type = "dir";else if (S_ISCHR(stat_buf.st_mode))

  p_file_type = "character special";else if (S_ISBLK(stat_buf.st_mode))

  p_file_type = "block special";else if (S_ISLNK(stat_buf.st_mode))

  p_file_type = "symbolic link";else if (S_ISFIFO(stat_buf.st_mode))

  p_file_type = "fifo";else if (S_ISSOCK(stat_buf.st_mode))

  p_file_type = "socket";else p_file_type = "unknow";printf("%s ——> %s\n",argv[i], p_file_type);}

  return 0;}

  [/code]测试[code] [test@test stat_code]$ ./file_type /dev/initctl /etc/passwd /dev/sda /dev/tty /dev/log /dev/cdrom /dev/initctl ——> fifo /etc/passwd ——> regular /dev/sda ——> block special /dev/tty ——> character special /dev/log ——> socket /dev

在线留言

我要留言