操作系统实践——知识点与小demo总结(Linux 进程管理)
ℹ️ 写在前面 本文尚未完成,但近期不会补充完整。 这里记录一下还需要写的部分: 实验代码与解析 实验3:Linux 进程管理 基本原理与知识点 读端与写端的区分 piep() 系统调用中: fd[0] 是读端 fd[1] 是写端 close() 怎么理解 通俗易懂的说,我们可以把文件描述符理解为电话号码。 1 2 pipe(fd) // 创建管道;相当于申请了一对专线电话, // 其中一条只能听(fd[0]),一条只能说(fd[1]) 假设pipe(fd) 后,fd[0]=3,fd[1]=4。 子进程创建后,会复制父进程的整个”通讯录“,而不是新建管道。 也就是说在子进程中,依然是fd[0]=3,fd[1]=4。 让我们回到 close() ,可以这样理解,一个进程执行 close(fd[1]) ,意味着它删除了这条拿来说的电话线(fd[1] 是写端),此后它不能再往这个管道中写数据,只能读。 但值得注意的是,父进程 close(fd[1]) 后,子进程不受影响,子进程依然可以写数据。 一句话总结:每个进程有自己的 fd,但指向同一个管道。close() 只是减少该管道在这个进程中的引用。 read() 函数返回什么? read() 的典型用法如下所示: 1 ssize_t n = read(fd, buf, count); 返回值 含义 场景 > 0 实际读取的字节数 正常情况,可能小于 count(短读) 0 EOF(文件结束) 所有写端都已关闭 -1 出错 被信号中断、非阻塞无数据等 创建管道时,读写两端自动打开,无需 open() 文件描述符(fd)是啥? 文件描述符是进程级别的”文件句柄“,是一个非负整数(0,1,2,3,…)。 可以这样理解,一个进程中有一张表格,列举了进程打开的I/O资源(文件、管道、设备等),这个文件描述符可以理解为这个表格的整数索引。 进程通过编号(文件描述符号),可以让内核操作资源,无需知道文件在内核中的复杂结构。 fd 是进程私有的,比方说有两个进程,进程 A 的 fd=3 可能指向管道;进程 B 的 fd=3 可能指向完全不同的文件。 ...