1.文件操作
硬件级别
- fdisk:将硬盘、U盘或SDC盘分区。
- mkfs:格式化磁盘分区,为系统做好准备。
- fsck:检查和维修系统。
- 碎片整理:压缩文件系统中的文件。
操作系统中的文件系统函数
#前缀k表示内核函数
kmount(), kumount() (mount/umount file systems)
kmkdir(), krmdir() (make/remove directory)
kchdir(), kgetcwd() (change directory, get CWD pathname)
klink(), kunlink() (hard link/unlink files)
kchmod(), kchown(), kutime() (change r|w|x permissions,owner,time)
kcreat(), kopen() (create/open file for R,W,RW,APPEND)
kread(), kwrite() (read/write opened files)
klseek(), kclose() (lseek/close file descriptors)
ksymlink(), kreadlink() (create/read symbolic link files)
kstat(), kfstat(), klstat() (get file status/information)
kopendir(), kreaddir() (open/read directories)
I/O库函数
- FILE mode I/0: fopen(),fread(); fwrite(),fseek(),fclose(),fflush()
- char mode I/0: getc(), getchar(),ugetc(); putc(),putchar()
- line mode I/0: gets(), fgets(); puts(), fputs()
- formatted I/0: acanf(),fscanf(),sscanf(); printf(),fprintf(),sprintf()
用户命令
mkdir, rmdir, cd, pwd, ls, link, unlink, rm, cat, cp, mv, chmod, etc.
低级别文件操作
分区
创建一个叫mydisk的虚拟磁盘
dd if=/dev/zero of=mydisk bs=1024 count=1440
在磁盘映像上运行fdisk
fdisk mydisk
格式化分区
#每块都是bsize字节
mkfs -t TYPE [-b bsize] device nblocks
假设是 EXT2/3 文件系统,它是 Linux 的默认文件系统。
mkfs -t ext2 vdisk 1440 或 mke2fs vdisk 1440
sudo mount -o loop vdisk /mnt
sudo umount /mnt 或 sudo umount vdisk
挂载分区
#(1)用dd命令创建一个虚拟磁盘映像
dd if=/dev/zero of=mydisk bs=1024 count=32768
#(2)在vdisk上运行fdisk来创建一个分区P1
fdisk vdisk
#(3)使用以下扇区数在vdisk的分区1上创建一个循环设备
losetup -o $(expr 2048 \* 512) --sizelimit $(expr 65535 \* 512) /dev/loop1
vdisk
losetup -a
#(4)格式化/dev/loop1,它是一个EXT2文件系统
mke2fs -b 4096 /dev/loop1 7936
#(5)挂载循环设备
mount /dev/loop1 /mnt
#(6)访问作为文件系统一部分的挂载系统
(cd /mnt; mkdir bin boot dev etc user)
#(7)设备使用完毕后,将其卸载
umount /mnt
#(8)循环设备使用完毕后,通过以下命令将其断开
losetup -d /dev/loop1
2.使用系统调用进行文件操作
系统调用
系统调用(System Call)是操作系统提供给应用程序的一种接口,应用程序可以通过系统调用请求操作系统执行特权指令,以完成一些需要特权级别的任务,如文件操作、进程管理、网络通信等。系统调用提供了用户空间程序与内核空间之间的通信机制。
-
文件系统相关:如open、close、read、write、lseek等,用于文件的打开、关闭、读取和写入操作。
-
进程管理:如fork、exec、exit、wait等,用于创建进程、执行新程序、退出进程以及等待子进程结束。
-
内存管理:如brk、mmap、munmap等,用于动态分配和释放内存空间。
-
网络通信:如socket、bind、connect、send、recv等,用于创建网络套接字、建立连接、发送和接收网络数据。
-
时间和日期:如time、gettimeofday等,用于获取系统时间和日期信息。
-
信号处理:如kill、signal等,用于发送信号和处理信号。
-
用户权限:如getuid、setuid、getgid、setgid等,用于获取和设置用户的权限和身份。
简单的系统调用
- access:检查对某个文件的权限
int access(char *pathname, int mode);
- chdir:更改目录
int chdir(const char *path);
- chmod:更改某个文件的权限
int chmod(char *path, mode_t mode);
- chown:更改文件所有人
int chown(char *name, int uid, int gid);
- chroot:将(逻辑)根目录更改为路径名
int chroot(char *pathname);
- getcwd:获取 CWD 的绝对路径名
char *getcwd(char *buf, int size);
- mkdir:创建目录
int mkdir(char *pathname, mode_t mode);
- rmdir:移除目录(必须为空)
int rmdir(char *pathname);
- link:将新文件硬链接到旧文件
int link(char *oldPath, int *newPath);
- unlink:取消某个文件的链接;如果文件的链接数为0,则删除文件
int unlink(char *pathname);
- symlink:创建一个符号链接
int symlink(char *target, char *newpath);
- rename:更改文件名称
int rename(char *oldPath, int *newPath);
- utime:更改文件的访问和修改时间
int utime(char *pathname, struct utimebuf *time);
以下系统调用需要超级用户权限。
- mount:将文件系统添加到挂载点目录上
int mount(char *specialfile, char *mountDir);
- umount:分离挂载的文件系统
int umount(char *dir);
- mknod:创建特殊文件
int mknod(char *path, int mode, int device);
常用的系统调用
- stat:获取文件状态信息
int stat(char *filename, struct stat *buf);
int fstat(char filedes, struct stat *buf);
int lstat(char *filename, struct stat *buf);
- open:打开一个文件进行读、写、追加
int open(char *file, int flags, int mode);
- close:关闭打开的文件描述符
int read(int fd);
- read:读取打开的文件描述符
int read(int fd, char buf[], int count);
- write:写入打开的文件描述符
int write(int fd, char buf[], int count);
- lseek:重新定位文件描述符的读/写偏移量
int lseek(int fd, char offset, int whence);
- dup:将文件描述符复制到可用的最小描述符编号中
int dup(int oldfd);
- dup2:将 oldfd 复制到 newfd 中,如果 newfd 已打开,先将其关闭
int dup2(int oldfd, int newfd);
- link:将新文件硬链接到旧文件
int link(char *oldPath, int *newPath);
- unlink:取消某个文件的链接;如果文件的链接数为0,则删除文件
int unlink(char *pathname);
- symlink:创建一个符号链接
int symlink(char *target, char *newpath);
- readlink::读取符号链接文件的内容
int readlink(char *path, char *buf, int bufsize);
- umask:设置文件创建掩码;文件权限为(mask & ~umask)
int umask(int umask);
链接文件
硬链接文件
硬链接:命令
ln oldpath newpath
创建从 newpath 到 oldpath 的硬链接,对应的系统调用为:
link(char *oldPath, int *newPath)
符号链接文件
软连接:命令
ln -s oldpath newpath # ln command with the -s flag
创建从 newpath 到 oldpath 的软链接或符号链接,对应的系统调用为:
symlink(char *target, char *newpath)
部分代码
#ls#
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
#include <string.h>
int main(int argc,char * argv[]){
if(argc<2){
printf("%s need filename\n",argv[0]);
return -1;
}
struct stat st;
int ret=stat(argv[1],&st);
if(ret==-1){
perror("stat");
return -1;
}
char perms[11]={0};
switch (st.st_mode & S_IFMT){
case S_IFLNK:
perms[0]='l';
break;
case S_IFDIR:
perms[0]='d';
break;
case S_IFREG:
perms[0]='-';
break;
case S_IFBLK:
perms[0]='b';
break;
case S_IFCHR:
perms[0]='c';
break;
case S_IFSOCK:
perms[0]='s';
break;
case S_IFIFO:
perms[0]='p';
break;
default:
perms[0]='?';
break;
}
perms[1]=(st.st_mode & S_IRUSR) ? 'r':'-';
perms[2]=(st.st_mode & S_IWUSR) ? 'w':'-';
perms[3]=(st.st_mode & S_IXUSR) ? 'x':'-';
perms[4]=(st.st_mode & S_IRGRP) ? 'r':'-';
perms[5]=(st.st_mode & S_IWGRP) ? 'w':'-';
perms[6]=(st.st_mode & S_IXGRP) ? 'x':'-';
perms[7]=(st.st_mode & S_IROTH) ? 'r':'-';
perms[8]=(st.st_mode & S_IWOTH) ? 'w':'-';
perms[9]=(st.st_mode & S_IXOTH) ? 'x':'-';
int linkNum=st.st_nlink;
char * fileUser = getpwuid(st.st_uid)->pw_name;
char * fileGrp = getgrgid(st.st_gid)->gr_name;
long int fileSize = st.st_size;
char * time = ctime(&st.st_mtime);
char mtime[512]={0};
strncpy(mtime,time,strlen(time)-1);
char buf[1024];
sprintf(buf,"%s %d %s %s %ld %s %s",perms,linkNum,fileUser,fileGrp,fileSize,mtime,argv[1]);
printf("%s\n",buf);
return 0;
}
标签:char,文件,int,笔记,学习,mode,四周,buf,链接
From: https://www.cnblogs.com/qi-yu-lin/p/17738623.html