Linux学习总结(二)

来源:互联网 发布:李刚java 官网 编辑:程序博客网 时间:2024/06/06 02:18

Linux学习总结(二)

读/写目录内容

readdir读取目录内容

struct dirent *readdir(DIR *dirp);

每调用一个readdir(),其将返回指向下一个目录的指针。如果达到目录的结尾,或者检测到无效的seekdir()操作,将返回NULL指针。返回类型为struct dirent

struct dirent {    long d_ino;//inode值    _kernel_off_t d_off;//从当前开始到当前目录条的距离    unsigned short d_reclen;//用以存储文件名的空间大小,根据文件名长度有差异    char d_name[256];//文件名,以'\0'结尾};

定位目录位置:

类似于普通文件,目录文件也可以进行定位和位置设置,

telldir()返回目录流相关联的当前位置seekdir()在目录流上设置下一个操作的位置。rewinddir()将目录流的位置中重置到目录的开头。    long int telldir(DIR *dirp)void seekdir(DIR *dirpm, long int loc);void rewinddir(DIR *dirp);

添加和删除目录:

mkdir()创建目录rmdir()删除目录extern int mkdir(_const char *_path,_mode_t _mode)*_path 创建的目录文件路径 _mode 文件权限,执行成功返回0,否则返回-1extern int rmdir (_const char *path)

获取当前工作路径

getcwd()//获取当前工作路径到buf中extern char *getcwd (char *_buf, size_t _size); size的数值至少比所返回路径名的长度大1,否则返回NULL,如果设置buf为NULL,getcwd()将利用malloc()获取空间get_current_dir_name():如果执行成功返回当前路径,如果失败返回NULL,extern char *get_current_dir_name(void);

修改当前工作路径

chdir()//修改当前工作路径,参数为修改后的目录路径,此目录路径需要有执行访问的权限extern int chdir(_const char *_path)如果执行成功则返回0,否则返回-1fchdir()chroot 可以修改一个进程可以访问的根目录路径#include <unsitd.h>int chroot(const char *path);

PCB:Process Control Block 进程管理块

文件系统管理

ext2文件系统结构
超级块:整个文件系统的第一块空间。包括整个文件系统的基本信息,如块大小、指向空间inode和数据块的指针等相关信息
Inode块:文件系统索引,包含了文件系统中文件的基本属性、存放数据的位置等相关信息。
数据块:具体存放数据的位置区域
文件属性存储结构体inode的成员变量i_mode存储着文件的文件类型和权限,为short int型
第0~8位为权限位,分别对应拥有者、组成员、其他用户的读写和执行权限
第9~11位为权限修饰位,包括设置有效ID位、设置有效组ID位和粘贴位。
第12~15位为文件类型位

linux文件类型

文件类型主要有:目录文件、字符设备文件、块设备文件、常规文件、管道文件、符号连接文件和套接字文件。
常规文件:即系统普通文件
目录文件:即通常所说的目录,它是一种特殊的文件
字符设备文件:在linux操作系统中将设备作为文件来处理,设备文件又分为块设备文件和字符设备文件。设备文件一般储存在/dev目录下。字符设备按字符读取数据(每次只读一个字符),如串口、终端、打印机、键盘等。如果是字符设备文件,当使用ls -l命令查看时,这类文件权限位前显示为字母“c”
块设备文件:块设备文件按块大小读取数据,如磁盘驱动器,内存RAM.如果是块设备文件当使用ls -l命令查看时,这类文件权限前显示字母”b”
符号连接设备文件:符号连接文件类似于windows的快捷方式。当使用ls -l命令查看时,这类文件权限位前显示为字母“l”.这类文件包含了另一个文件的路径名。它可以连接任意文件或目录,可以连接不同文件系统的文件,甚至可以连接不存在的文件,也可以循环连接自己,用ln -s命令可以生成一个符号连接文件,删除符号链接文件时,系统仅仅删除符号链接文件本身,而不删除源文件本身。
硬链接文件:
不允许给目录创建硬连接。
只有在同一个文件系统中的文件之间才能创建硬链接
删除硬链接文件时,硬链接文件仍然存在,只是将硬链接数自动减去1.
套接字文件:当启动MySQL服务器时,会产生mysql.sock文件。当使用ls -l命令查看时权限位前显示为S
管道文件:管道是UNIX系统实现IPC的一种机制,一个进程向管道里写信息,另一个进程从管道中读数据。当用命令ls -l查看时,这类文件的权限位前显示为字母“p”,普通用户可以使用mknod命令创建管道文件。
如果测试摸个打开的文件描述符的原文件是何种类型,可以使用isfdtype()

extern int isfdtype(int _fd, int _fdtype);

文件权限修饰位:
文件访问权限位:
读取文件属性
可以通过函数stat来读取任意类型文件的属性。

extern int stat(_const char *_restrict_file, struct stat *_restrict_buf)

第一个参数为要读取状态文件的路径,可以是绝对路经或相对路径, 第二个参数为文件属性临时存放位置,其类型为struct stat,如果执行成功,返回0,如果出错,返回-1.
如果要读取已打开的文件的状态,可以使用fstat函数

extern int fstat (int _fd, struct stat *_buf);

如果stat函数的第一个参数为符号链接文件,其读取的属性为源文件的属性,因此,要获取连接文件自身的属性,则需要调用lstat函数

extern int lstat(_const char *_restrict_file, struct stat *_restrict_buf);

修改文件权限

在shell上,可以使用chmod命令修改某个文件的权限,在应用编程下如果要对文件的权限位进行修改,可以使用chmod()函数来实现。

extern int chmod(_const char *_file, _mode_t _mode)

第一个参数为修改权限的文件名,第二个参数为修改的权限描述。如果执行成功,返回0,否则返回-1.
如果是符号链接文件,chmod修改的是源文件权限,要修改本身的权限,则需要使用lchmod()函数来修改。

extern int lchmod(_const char*_file, _mode_t _mode);

如果需要对已经打开的文件,则可以使用fchmod函数来修改权限

extern int fchmod(int _fd, _mode_t _mode);

修改系统umask值

获取当前系统umask值的函数为getmask,设置创建文件的掩码函数为umask

extern _mode_t umask(_mode_t _mask);返回系统原来文件的权限umask值extern _mode_t getmask(void);

修改文件的拥有者及组

在shell中,使用chown和chgrp命令来修改
在linux下c应用编程中,可以使用chown函数来修改文件的拥有者和拥有者组

extern int chown(_const char *_file, _uid_t _owner, _git_t _group);

第一个参数为欲修改用户的文件,第二个参数为修改后的文件拥有者ID,第三个参数为修改后该文件拥有者所在的GID
对于已经打开的文件,使用fchown函数来修改,

extern int fchown(int _fd, _uid_t _owner, _gid_t _group);

对于符号链接文件,如果要修改本身的拥有者所在的组,则需要使用lchown函数

extern int lchown(_const char *_file, _uid_t _owner, _git_t _group);

用户名/组名UID/GID的转换

函数getpwuid()和getwnam()可以通过用户UID或用户名查看某特定用户的基本信息

struct passwd *getpwuid(_uid_t _uid);struct passwd *getpwnam(_const char *_name);

struct passwd 结构体
函数getgrgid()和gergrnam()可以通过用户组GID或者用户组组名查看特定用户的基本信息

struct group *getgrgid(_gid_t _gid);struct group *getgrnam(_const char *_name);

创建/删除硬链接

创建硬链接:编程中使用link()函数来创建硬链接文件。

int link(_const char *_from, _const char *_to);第一个参数为源文件的路径,第二个参数为新硬链接文件的路径

删除硬链接:如果要执行删除某文件操作,则可以使用unlink()函数,使源文件的属性中的硬链接数自动减1,当为0时,即删除文件

int unlink(_const char *_name);

符号链接文件特殊操作

创建符号链接:

int symlink(_const char *_from, _const char *_to)第一个参数为源文件的路径,第二个参数为新链接文件的路径,需要保证源文件存在,链接文件不存在

读取符号链接文件源文件

int readlink(_const char *_restrict_path, char *_restrict_buf, size_t _len);

第一个参数为符号链接文件路径,第二个参数为 存储文件路径的内存起始地址,第三个参数为可用空间大小。因此这个函数的功能是将指定符号链接文件的源文件路径读入到buf中