linux系统编程及基本命令
系统编程
基本命令
按下开机键Linux发生了什么
BIOS -> MBR -> 引导加载程序 -> 内核 -> init process -> login
进程退出方式及区别
不管哪种退出方式,系统最终都会执行内核的同一代码,这段代码用来关闭进程打开的文件描述符,释放它占用的内存和其他资源
-
退出
- 正常退出
- main函数调用return
- 调用exit()函数
- 调用_exit()函数
- 异常退出
- 调用abort函数
- 进程收到某个信号,该信号使程序终止
- 正常退出
-
已结束进程的状态
- shell执行 echo $?,保存最近一次运行的进程的返回值
- 程序中main函数运行结束,保存main函数的返回值
- 程序调用exit函数结束运行,保存exit函数的参数
- 程序异常退出,保存异常出错的错误号
- shell执行 echo $?,保存最近一次运行的进程的返回值
-
区别
- exit和return的区别
- exit是函数,有参数,exit执行完会把控制权交给系统,exit(0)表示正常终止,其他值表示有错误发生
- return是函数执行完后的返回,return执行完后把控制权交给调用函数
- exit和abort的区别
- exit是正常终止进程
- abort是异常终止进程
- exit和_exit函数的区别
- exit在头文件stdlib.h中声明,_exit是在头文件unistd.h中声明
- exit是_exit之上的一个封装, exit先刷新流数据 ,再调用_exit函数
- _exit会关闭进程打开的文件描述符,清理内存,不会刷新流数据
- linux的库函数,有一种“缓冲IO”的操作,对应每一个打开的文件,在内存中有一片缓冲区,每次读文件,会连续读出若干条记录,下次再读文件的时候,直接从内存的缓冲区中读;同样写文件也是先写入缓冲区,满足一定条件才将缓冲区的内容一次性写入文件。具体可以看printf和write的区别,及行缓冲和全缓冲
- exit先刷新流数据,将文件缓冲区的内容写回文件,可以保证数据的完整性,_exit会将数据直接丢失
- exit和return的区别
回收进程资源的方式和区别
- init进程(进程号为1)会周期性的调用wait系统调用来清除各个僵尸进程
- wait
pid_t wait (int *status)
status表示子进程的退出状态,成功返回值为子进程进程号,失败为-1- 进程一旦调用wait函数,立即阻塞自己, 判断当前进程的某个子进程是否变成僵尸进程
- 若存在则收集子进程的信息,将它彻底销毁然后返回
- 若没有,则会一直阻塞,直到出现一个
- waitpid
- waitpid相当于wait函数的封装,多了两个由用户控制的参数pid和options,可以自定义回收的子进程进程号,并设置是否阻塞
pid_t waitpid(pid_t pid, int * status, int options)