Linux系统编程(一)

一.Linux文件编程creat open read write函数

文件编程 进程线程编程 tcp/udp 操作系统五大功能
Linux文件:文件本身包含的数据(打开文件可以看到的数据信息)
文件属性(元数据:文件的访问权限,文件的大小,创建日期等)
目录也是文件之一(当创建一个新的目录的时候,系统自动创建两个文件项. …)
. :当前目录
… :上一级目录

dev 设备文件
lib 库文件
boot 启动文件
root 系统管理员root用户的相关文件
sys 内核信息
proc 内核
var 日志文件
etc 系统和软件的配置文件
home 用户家目录
b 启动文件
bin 用户二进制文件
sbin 高级文件
media 文件系统的挂载点
usr 用户安装软件
usr/include 头文件
usr/bin 多数日常应用程序
usr/lib 系统文件
usr/local 用户个人安装软件
usr/sbin 在当前用户模式中不用的系统管理程序
usr/src 源代码
var/cache 应用程序的缓存文件
var/lib 应用程序信息,数据
var/local usr/local中的程序信息
var/lock 锁文件
var/log 日志文件
var/opt /opt中的程序信息,数据
var/run 正在执行的程序信息,PID文件
var/tmp 临时文件

Linux文件类型:
(-)普通文件
(d)目录文件
(c/b)设备文件
(l)链接文件
(p)管道文件
(f)栈堆文件
(s)共享文件

操作系统:内核 :操作系统对于软硬件和系统资源分配的最重要的核心部分
系统调用:操作系统提供给用户的一组特殊的接口,用户可以通过这组接口来获取操作系统内核提供的服务
用户编程接口:系统调用并不是直接和程序员进行交互,它仅仅是一个通过软中断机制向内核提交请求,以获取内核服务器的接口,在实际使用中程序员调用的通常是用户编程接口(API)

在这里插入图片描述

在这里插入图片描述

文件:
文件描述符:本质是一个正整数 open函数 0-OPEN-MAX
file*
结构体

在这里插入图片描述

man:
1、Standard commands (标准命令)
2、System calls (系统调用)
3、Library functions (库函数)
4、Special devices (设备说明)
5、File formats (文件格式)
6、Games and toys (游戏和娱乐)
7、Miscellaneous (杂项)
8、Administrative Commands (管理员命令)

缓冲区:程序中每个文件都可以使用
磁盘文件-》缓冲区-》内核(cpu)

open系列函数:creat:创建文件函数
int creat(文件描述符,创建模式)
创建模式
S_IRUSR 可读
S_IWUSR 可写
S_IXUSR 可执行
S_IXRWU 可读可写可执行

在这里插入图片描述

open(“文件名”,flag:打开的方式,mode如果没有创建那么自动略过)
O_RDONLY:以只读方式打开文件
O_WRONLY:以只写方式打开文件
O_RDWR:以可读可写的方式打开文件
O_CREAT:如果文件存在就打开,如果不存在就创建
O_APPEND:写文件的时候追加在文件末尾
出错返回值-1 正确则返回文件描述符
write函数:向文件写入数据
write(文件描述符,写入的数据指针,写入的数据内存大小)

在这里插入图片描述

在这里插入图片描述

read:从头文件读数据
read (文件描述符,读入某个变量(指针),读出数据大小)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

二.lseek fopen fwrite fread fseek getc getchar函数

5.lseek:用来调整光标的位置
lseek:(文件描述符,光标移动的位置数,光标的移动形式)
SEEK_SET:将光标移动到文件开头在增加相应的offset位置
SEEK_CUR:将光标移动到文件的前位置再往后加offset的位置
SEEK_END:将光标移动到文件的末尾在增加offset的位置
lseek函数返回值:返回值是从文件开头到光标位置有多少个字符

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

6.ftruncate:指将指定的文件大小修改成length指定的大小(用来给文件扩容,如果指定的大小小于当前文件,那就删除后面的数据)
ftruncate(int fd, length)
ftruncate(fd , 0)

stdio.h:C的标准输入输出库:I/O(input output)
file*

在这里插入图片描述

1.stdout:输出流
行缓冲:stdout在终端上进行输出的时候,输出的规则为每当出现换行符的时候进行一次刷新缓存,然后进行操作(printf输出的时候,是看到换行符才进行输出)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.fopen (): r:只读
w:只写:如果文件不存在,创建一个新的,如果文件存在,清空原先文件的文件内容
a:追加:不存在,创建一个新的,如果存在在文件末尾进行追加
r+:可读可写,文件不存在,打开失败
w+: w和r+的功能 可读可写,文件不存在,打开失败
a+: a和r+的功能 可读可写,文件不存在,打开失败,追加
fclose(fp)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.fread fwrite
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
ptr:字符串指针
size:读取每个字符的大小
nmemb:读取多少
stream:文件描述符指针

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.fseek
int fseek(FILE *stream, long offset, int whence);

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

5.读取字符的家族:getc:从文件里读取一个字符getc(fp)返回值:当读到文件末尾无.字符的时候,返回EOF(NULL)
fgetc:函数调用
getchar():将字符从unsigned char zhu转换成int进行返回
带走缓冲区多余的换行符
getc

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

getchar

在这里插入图片描述

在这里插入图片描述

三.fputc putchar fprintf sprintf fscanf sscanf函数

6.写字符的家族: fputc:将某一字符写入文件流
int fputc(int c,FILE*stream);
putc:宏
putchar()
fputc

在这里插入图片描述

在这里插入图片描述

putchar

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  1. printf 家族和scanf 家族
    printf
    fprintf int fprintf(FILE *stream, const char *format, …);
    stdout

在这里插入图片描述

在这里插入图片描述

sprintf():往字符串里写字符串

在这里插入图片描述

在这里插入图片描述

fscanf():从文件流里写读字符串
int fscanf(FILE *stream, const char *format, …);
stdin

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

sscanf():从字符串里读取变量
int sscanf(const char *str, const char *format, …);

在这里插入图片描述

在这里插入图片描述

四.Linux进程控制fork vfork函数

进程控制
1.什么事进程:进程是可并发执行的程序,是一个在数据集合上的运行过程
当一个程序开始执行后,在开始执行到执行结束的这段时间里,它内存中的部分被称为进程
通俗讲:程序:在硬盘上的可执行文件
进程:在执行中的程序
2.什么是并发
多进程同时运行,多任务同时执行
3.虚拟内存
Linux虚拟内存管理技术:
物理内存:实际在处理器中的内存模块(几百M)
将硬盘中的一部分存储单元拿来当内存使用 4G 受操作系统的寻址范围的影响
0x00000000 - 0xffffffff
4.操作系统:内核空间 和 用户空间
高地址1G 低地址
优点:1.有效防止内核空间被破坏
2.防止被恶意窥探(数据虽然是连续的,但并不是有序的)
3.拓展内存空间

在这里插入图片描述

Linux虚拟内存管理
虚拟地址存储方式= 物理地址+偏移量

5.进程的分类
1.守护进程
2.批处理进程
3.交互进程
进程的属性
进程的ID(PID):是唯一的数值,用来区分进程
父进程的ID:PPID
启动进程的用户ID:UID
进程的状态:运行R,休眠S,僵尸进程Z
进程优先级
进程占用资源的大小(内存,CPU)

6.进程控制模块PCB:数据结构
进程号 ps命令查看Linux系统中的进程
l:长格式输出
u:按用户名和启动时间的顺序来显示进程
f:用树状格式来显示进程
a:显示所有用户所有进程
x:显示无控制终端进程 (aux)
ps -aux | grep 进程名

%CPU占用cpu百分比 %MEM占用内存百分比
VSZ 虚拟内存 RSS物理内存 TTY终端ID STAT进程状态
TIME进程消耗CPU的时间 START进程开始时间 COMMAND命令参数
状态解析:s代表进程领导者
R可执行状态。S 可中断的睡眠状态。D 不可中断的睡眠状态。T 暂停状态或跟踪状态。Z 退出状态,进程成为僵尸进程。
< 优先级高的进程 +前台

kill:kill + 进程号 -9 强制终止
pkill:pkill + 程序名
xkill:在桌面上杀死图像化界面
renice:改变进程的优先级,通过进程ID(PID)来改变谦让度,进而达到改变进程的优先级
renice 谦让度 PID

7.进程的状态转换
(1)就绪:当进程已分配到除cpu以外的所有必要资源,只要获得处理器就可以立即执行
(2)执行:已经获取处理器,其程序正在处理器上执行
(3)阻塞:正在执行的进程,由于等待某个事件的发生而无法执行时,便放弃处理机会而处于阻塞状态

在这里插入图片描述

在这里插入图片描述

并发的本质:时间片轮巡

8.Linux进程调度
(1)FCFS也叫FIFO,先来先处理,缺点:对于短的任务可能变得非常缓慢
(2)时间片轮询算法:周期性的切换总体时常比FIFO短
(3)STCF:短任务优先算法
抢占式和非抢占式
(4)银行家算法
优先级反转

9.创建一个进程
fork()函数 有两个返回值 0是子进程 -1是失败 >0父进程
getpid():获取当前进程号
getppid():获取当前父进程号
父进程与子进程跑在不同的内存空间中:父进程与子进程有自己独立的内存空间
早期:fork函数运行之后,子进程会复制父进程的堆栈数据空间
优化:读时不管,写时复制
fork函数创建的父子进程关系时竞争关系,不能判断是谁先动

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

vfork():创建一个进程
(1)保证子进程先动
(2)当子进程调用exit()函数后,父进程往下执行
(3)不会继承父进程的页面
eg:1.创建两条进程,一条输出A,一条输出B,交替输出ABABABABABAB

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
交替循环输出ABC
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

家住隔壁我姓王8

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值