第三章 进程控制 3.1.4 fork、文件和数据

本文详细介绍了C语言中lseek()和read()函数的使用方法,包括如何改变文件的读写位置以及如何从文件中读取数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 看下面的程序:


  1. 在当前文件夹下新建了一个data.txt 文件,里面的字符数多于20,看下运行的结果:可以看出在父进程中打开的文件指针,在子进程中还是能用的,而且是公用的。

  1. 首先是 lseek( ) 函数:
头文件:
#include <sys/types.h>
#include <unistd.h>

off_t lseek(int fildes, off_t offset, int whence);

每一个已打开的文件都有一个读写位置,当打开文件时通常其读写位置是指向文件开头, 若是以附加的方式打开文件(如O_APPEND), 则读写位置会指向文件尾。 当read()或write()时, 读写位置会随之增加,lseek()便是用来控制该文件的读写位置。参数fildes 为已打开的文件描述词,参数offset 为根据参数whence来移动读写位置的位移数。

参数 whence 可以为:
SEEK_SET 参数offset 即为新的读写位置。
SEEK_CUR 以目前的读写位置往后增加offset 个位移量。
SEEK_END 将读写位置指向文件尾后再增加offset 个位移量。

当whence 值为 SEEK_CUR 或  SEEK_END 时, 参数offet 允许负值的出现。

SEEK_SET、SEEK_CUR 和 SEEK_END 是 System V 引入的,在这之前使用的是 0、1 和 2。

返回值:当调用成功时则返回目前的读写位置,也就是距离文件开头多少个字节。若有错误则返回-1,errno 会存放错误代码。

所以,也就能理解上面的函数:

if((pos = lseek(fildes, 0L, 1)) < 0L) {
...
}

其中的 fildes 是已打开的文件描述,使用 open( ) 函数调用得到的。上面的 lseek 函数的第三个形参为 1 ,其实就是 SEEK_CUR ,表示 lseek 函数会以目前打开的文件指向的文件头为基准,偏移 +0 位。 

  1. read( ) 函数:从某个已打开的文件中读取一定数量的字符,然后将这些字符放入某一个预存的缓冲区内,供以后使用。
头文件:
#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);

函数说明:read( )会把参数 fd 所指的文件传送 count 个字节到 buf 指针所指的内存中。 若参数count 为0, 则read()不会有作用并返回0。返回值为实际读取到的字节数, 如果返回0, 表示已到达文件尾或是无可读取的数据,此外文件读写位置会随读取到的字节移动。

所以上面的程序中的

read( fd, buf, 10) 也就好理解了。


========
参考链接:

C语言lseek()函数:移动文件的读写位置

lseek函数的用法

C语言read()函数:读文件函数(由已打开的文件读取数据)


VMware实验 2 进程管理 实验性质:验证 建议学时:2 学时 任务数: 3 个 一、 实验目的  掌握 linux 进程管理命令  阅读 linux 内核 PCB 块相关代码  使用 C 语言创建一个进程及其子进程,掌握创建进程的方法,理解进程程 序的区别。 二、 预备知识 1. linux 命令行 shell 的使用 2. 教材第二章 2.1~2.3 三、 实验内容 3.1 Linux 进程管理命令 3.1.1 进程管理的作用  判断服务器健康状态  查看系统中所有进程  杀死进程 3.1.2 ps 命令(查看当前系统中进程的快照) 结果默认会显示 4 列信息: PID: 运行着的命令(CMD)的进程编号 TTY: 命令所运行的终端 TIME: 运行着的该命令所占用的 CPU 处理时间 CMD: 该进程所运行的命令 3.1.3 top 命令(实时动态地查看系统的整体运行情况) 3.1.4 kill 命令(终止进程3.2 Linux 内核中 PCB 代码分析 阅读并分析/usr/src/linux-headers-5.4.0-62-generic/include/linux/sched.h 中进程控制块 相关定义。 找到进程控制块结构体定义,对应教材分析 3.3 Linux 进程控制 fork()通过复制调用进程来创建一个新进程。新进程被称为子进程;调用进程被称 为父进程函数特点 :  子进程进程在不同的内存空间中运行。  在 fork()的时候,这两个内存空间有相同的特性内容,两个进程将执行 fork() 系统调用之后的下一条指令,子进程使用相同的 CPU 寄存器值。  其中一个进程执行的内存写、文件映射反映射不会影响另一个进程。 基本使用方式如下 参考实例代码:test001.c 四、 思考与练习 1. ps 命令的参数的使用,如显示所有当前进程,显示指定用户进程等。 2. 分析 task_struck 结构体中主要字段的含义。 3. 分析父进程进程的关系 在虚拟机怎么完成该实验
03-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值