九.Linux——文件操作

接上文,我们先要继续介绍一个重要的知识------僵死进程。

僵死进程:子进程先于父进程结束,父进程没获取子进程的退出码,子进程会继续占用pid和进程表项(进程表一会会讲到)

所以,为了避免资源的大量浪费,导致系统无法新建进程,我们需要使用一种命令来解决这个问题:

wait():获取子进程的退出码。

操作如下:

代码流程:

  1. fork() 创建子进程
  2. 子进程:s="child", n=3,跳过 else 块,执行循环打印 3 次,最后执行exit(3)
  3. 父进程:s="parent",n=7,调用wait(&val)阻塞,等待子进程结束
  4. 子进程 exit (3) 之后,父进程 wait 返回,val 被内核赋值为3 << 8 = 768
  5. 父进程打印:val=768
  6. WIFEXITED(val) 判断为真(子进程正常退出)
  7. WEXITSTATUS(val) 取出 3,打印:val=3

运行结果:

可以清晰看到,子进程的正常退出,未发生僵死进程。

那如果父进程先于子进程结束,子进程就变成孤儿进程。系统会重新分配一个父进程,新的父进程会wait()获取子进程的退出码,使其不会变成僵死进程。


现在我们要正式开始文件操作的学习了:

read(),write(),open(),close()是linux系统提供的底层操作文件中的系统调用,实现在内核中;

例如:

write()是所有输出函数的底层;

printf()调用write(),fopen()调用open()

在Linux中,一切皆文件,任何东西都可以是一个文件

那文件在Linux中又如何表示呢?

文件描述符:描述打开的文件 (int fd)

文件表(记录打开的文件 1024个元素):

|-------|------------------|
| 文件描述符 | 内容 |
| 0 | 键盘 标准输入 stdin |
| 1 | 屏幕 标准输出 stdout |
| 2 | 屏幕 标准错误输出 stderr |
| 3 | a.txt |

默认情况下,0 1 2这三个文件都会被打开,后续例如想打开a.txt,会在文件表中挨个新加。

操作文件流程:

1.打开文件 open() ,设置权限:只读,只写,读写

2.读 写 read() write()

3.关闭文件 close()

因为默认打开了0,1,2文件(文件表),可以结合write(),read()在键盘,屏幕直接输入或输出

例如:write(1,"hello",5) 在屏幕上打印5个字符:hello

参数介绍:

  1. fd = 1 :文件描述符 1 = 标准输出 stdout (进程默认打开,指向终端屏幕)
    • fd 0:stdin 标准输入
    • fd 1:stdout 标准输出
    • fd 2:stderr 标准错误输出
  2. buf = "hello":用户缓冲区,要写入的数据首地址
  3. count = 5 :要写入5 个字节

注意:父进程打开一个文件,再fork()一个子进程,子进程会共享此文件,父进程读到哪,子进程会接着往下读;父进程close(),子进程继续使用,父进程和子进程必须都close()才会彻底关闭文件


这就是文件操作的所有内容,感谢您的观看🌼

相关推荐
园长的牧歌2 小时前
Ubuntu 打开应用在导航栏没有图标是个齿轮
linux·ubuntu
曦夜日长2 小时前
Linux系统篇,进程概念(四):内核链表的深度理解、进程优先级的底层理解
linux·运维·服务器·php
‎ദ്ദിᵔ.˛.ᵔ₎2 小时前
Linux 库制作与原理
linux
liulilittle3 小时前
Linux AI 开发环境搭建实录
linux·ai·llm·agent·hyper-v·dev·opencode
高亦真4 小时前
今天是学习嵌入式的第39天
linux·学习·算法
AR-26710-4 小时前
Linux Day8——FHS文件系统层次
linux
qq_297670874 小时前
Ubuntu 打开系统应用老弹密码?三步彻底关闭免密
linux
杨云龙UP4 小时前
DB2 HADR 主备切换实战:SQL1639N 认证问题、备库只读与双向 Takeover
linux·运维·数据库·db2·主备切换·角色互换