Unix环境高级编程学习笔记整理

第3章 文件I/O

对内核而言,所有打开的文件都能通过文件描述符引用。(建立好链接的套接字描述符在unix系统使用文件描述符实现的)。

内核使用三种数据结果表示打开的文件。
(1)每个进程在进程表中都有一个记录项,记录项中包含有一张打开文件的描述符表,每个描述符占用一项。表中的每个文件描述符包含:①文件描述符标志②指向一个文件表项的指针。
(2)内核为所有打开文件维持一张文件表。每个文件表项包含:
文件状态标志(包含读写,填写,同步,非阻塞等)
当前文件偏移量
指向该文件v节点表项的指针。
(3)每个打开的文件都有一个v节点结构。v节点包含了文件类型和对此文件进行各种操作的函数的指针。对于大多数文件,v节点还包括了该文件的i节点。这些信息是再打开文件时从磁盘上读入内存的。这些文件都是从磁盘读入内存的,所以可以快速使用这些参数。

note:linux没有使用v节点,而是使用了通用的i节点。



多个进程打开同一个文件的情况如下图(fork的另一个特性是所有由父进程打开的描述符都被复制到子进程中。父子进程中相同标号的文件描述符在内核中指向同一个file结构体,也就是说,file结构体的引用计数要增加。):


第4章 文件和目录

我觉得这一章中最主要的就是stat结构了(stat结构大多数取自i节点):

struct stat {
        mode_t     st_mode;       //文件对应的模式,文件,目录等
        ino_t      st_ino;       //inode节点号
        dev_t      st_dev;        //设备号码
        dev_t      st_rdev;       //特殊设备号码
        nlink_t    st_nlink;      //文件的连接数
        uid_t      st_uid;        //文件所有者
        gid_t      st_gid;        //文件所有者对应的组
        off_t      st_size;       //普通文件,对应的文件字节数
        time_t     st_atime;      //文件最后被访问的时间
        time_t     st_mtime;      //文件内容最后被修改的时间
        time_t     st_ctime;      //文件状态改变时间
        blksize_t st_blksize;    //文件内容对应的块大小
        blkcnt_t   st_blocks;     //伟建内容对应的块数量
      };

第5章 标准I/O库

相当于在内核io上加了一层包装。

第7章 进程环境

C程序的存储空间布局(进程地址空间布局)


void do_line();
int a=0; //初始化数据段 包含c程序中出现在函数之外的声明,带有初值的变量。
int b; //未初始化数据段
main(){
int b;//栈,在main栈帧中
char s[]="abc"; //栈
static int c=0; //初始化数据段
pl=(char*)malloc(10); //堆 在堆中进行动态存储分配
}
do_line(){
int a;//栈,在do_line栈帧中
}

栈由编译器自动分配释放,操作方式类似数据结构中的栈,栈帧顺序从高地址往下。

堆一般由程序员分配释放,堆从低地址往上。

递归函数每次调用自身时,就是用一个新栈帧,因此一个函数调用实例中的变量集不会影响到另一个函数调用实例中的变量。

第8章 进程控制

当运行一个程序时,操作系统需要创建一个进程,这个进程的虚拟内存空间与前一页的“c程序存储结构”映射起来。可执行程序并非真正读到物理内存,只是链接到进程的虚拟内存中。


当进程所需要的数据或内容未在物理内存中时,则可以根据页表机制将其换进来(这里终于跟操作系统的内存管理联系起来了)

exec函数:当进程调用一种exec函数时,该进程执行的程序完全替换为新程序,而新程序则从其main函数开始执行(其实就是地址空间的变化呗)

fork函数:


父进程和子进程根据不同内核调度算法,返回顺序不确定。

子进程获取父进程数据空间,堆和栈(其实就是虚拟内存空间),物理内存并不复制,但如果有进程修改物理内存中的内容时,则复制出新的页,称为“写时复制”。

fork两种常见用法:

(1)一个父进程希望复制自己,常见于网络服务进程。

(2)一个进程要执行一个不同程序。(子进程从fork返回后立即调用exec)。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UNIX环境高级编程笔记是关于在UNIX系统中进行高级编程的一些笔记和技巧的记录。这些笔记主要涉及文件I/O和进程管理等方面的内容。在UNIX系统中,文件I/O是通过文件描述符来进行操作的。文件描述符是一个整数,用来标识打开的文件。为了实现跨平台的兼容性,可以使用POSIX标准来进行文件操作。POSIX是一个操作系统接口的标准,它以UNIX为基础,但并不限于UNIX类系统。此外,Single UNIX Specification简称SUS,它是POSIX.1标准的一个超集,定义了UNIX系统的实现标准。在UNIX系统中,进程的初始化是由init进程来完成的。init进程会读取文件/etc/ttys,并根据其中定义的终端设备进行处理。对于每个允许登录的终端设备,init进程会调用fork函数生成一个子进程,并通过exec函数执行getty程序来处理该终端设备。通过这些技巧和方法,可以实现在UNIX环境下进行高级编程的需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [UNIX环境高级编程笔记](https://blog.csdn.net/qq_55537010/article/details/127837953)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [《UNIX环境高级编程学习笔记](https://blog.csdn.net/qq_42526420/article/details/123143423)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值