Linux常见系统调用函数 fork(), lseek(), fcntl()等

本文深入探讨了Linux系统中的文件操作,特别是lseek()函数的使用,用于修改文件读写位置,以及如何通过lseek拓展文件。同时,文章讲解了fcntl()函数,用于改变已打开文件的访问控制属性,并介绍了fork()函数在进程创建中的作用。

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

lseek()

文件偏移:

Linux中可使用系统函数lseek来修改文件偏移量(读写位置)
每个打开的文件都记录着当前读写位置,打开文件时读写位置是0,表示文件开头,通常读写多少个字节就会将读写位置往后移多少个字节。但是有一个例外,如果以O_APPEND方式打开,每次写操作都会在文件末尾追加数据,然后将读写位置移到新的文件末尾。lseek和标准I/O库的fseek函数类似,可以移动当前读写位置(或者叫偏移量)。
回忆fseek的作用及常用参数。SEEK_SET、SEEK_CUR、SEEK_END 
int fseek(FILE *stream, long offset, int whence); 
成功返回0;失败返回-1
特别的:超出文件末尾位置返回0;往回超出文件头位置,返回-1
off_t lseek(int fd, off_t offset, int whence);失败返回-1;成功:返回的值是较文件起始位置向后的偏移量。
特别的:lseek允许超过文件结尾设置偏移量,文件会因此被拓展。
注意文件“读”和“写”使用同一偏移位置。

lseek常用应用:

1)更改文件偏移位(read write同时操作同一文件时)
2)使用lseek拓展文件:write操作才能实质性的拓展文件。单lseek是不能进行拓展的。
一般:write(fd, "a", 1);
	od -tcx filename  查看文件的 16 进制表示形式      
	od -tcd filename  查看文件的 10 进制表示形式  

3)通过lseek获取文件的大小:lseek(fd, 0, SEEK_END); 
注意:lseek函数返回的偏移量总是相对于文件头而言。

fcntl()

改变一个“已经打开”的文件的访问控制属性。
重点掌握两个参数的使用,F_GETFL和F_SETFL。

int flag = fcntl(cfd, F_GETFL);

flag |= O_NONBLOCK;

fcntl(cfd, F_SETFL, flag);
//这三句等效于 fcnl(cfd, F_GETFL);

F_SETFL,F_GETFL设置文件读写模式

fork()在这里插入图片描述

pid_t 类型表示进程 ID,但为了表示-1,它是有符号整型。(0 不是有效进程 ID, init 最小,为1)

注意返回值:不是 fork 函数能返回两个值,而是 fork 后,fork 函数变为两个,父子需各自返回一个。子进程复制父进程的0到3g空间和父进程内核中的PCB,但id号不同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值