接上文,我们先要继续介绍一个重要的知识------僵死进程。
僵死进程:子进程先于父进程结束,父进程没获取子进程的退出码,子进程会继续占用pid和进程表项(进程表一会会讲到)
所以,为了避免资源的大量浪费,导致系统无法新建进程,我们需要使用一种命令来解决这个问题:
wait():获取子进程的退出码。
操作如下:

代码流程:
- fork() 创建子进程
- 子进程:s="child", n=3,跳过 else 块,执行循环打印 3 次,最后执行exit(3)
- 父进程:s="parent",n=7,调用wait(&val)阻塞,等待子进程结束
- 子进程 exit (3) 之后,父进程 wait 返回,val 被内核赋值为3 << 8 = 768
- 父进程打印:val=768
- WIFEXITED(val) 判断为真(子进程正常退出)
- 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
参数介绍:
- fd = 1 :文件描述符 1 = 标准输出 stdout (进程默认打开,指向终端屏幕)
- fd 0:stdin 标准输入
- fd 1:stdout 标准输出
- fd 2:stderr 标准错误输出
- buf = "hello":用户缓冲区,要写入的数据首地址
- count = 5 :要写入5 个字节
注意:父进程打开一个文件,再fork()一个子进程,子进程会共享此文件,父进程读到哪,子进程会接着往下读;父进程close(),子进程继续使用,父进程和子进程必须都close()才会彻底关闭文件
这就是文件操作的所有内容,感谢您的观看🌼