1.linux下一个进程默认最多打开1024个文件
2.truncate函数:
- int truncate(const char *path, off_t length);
- path文件名,length长度,返回值成功返回0失败返回-1
- 文件名必须存在,若长度大于原则拓展,反之截断
进程和程序: - 什么是程序:编译好的二进制文件
- 什么是进程:运行中的程序
- 站在程序员角度:运行一系列指令的过程
- 站在操作系统角度:分配资源的基本单位
- 一个程序对应多个进程,一个进程对应多个程序
- 程序没有生命周期,进程有生命周期
单道程序设计:每次只能运行一个程序的操作系统,很快就被淘汰了
多道程序设计:把cpu分成很多时间片,在各个程序之间切换运行。在微观上串行,在宏观上并行的设计
进程的状态转换:
MMU内存管理单元:
- 1.虚拟内存地址与物理内存进行绑定 由图可以看出4-3的1g内核区在物理内存上的映射关系是同一块,因为不同进程之间要打交道。用户的数据是独立的
2.设置修改内存访问级别
linux一般只有两个级别,0和3用户和内核越小界别越高
获取环境变量:
getenv函数获取环境变量:
- char *getenv(const char *name);
达到的作用和echo $PATH是一样的
进程pid:
- pid_t fork(void);
返回值:
-
失败返回-1,没有产生子进程
-
父进程返回子进程的pid,子进程返回0
-
pid_t getpid(void);获得当亲进程的pid
-
pid_t getppid(void);获得当前进程父进程的pid
查看进程信息:
ps:
-
ps aux
-
ps ajx -----追溯进程间的血缘关系
-
kill杀死进程,实际上是给进程发送一个信号,信号就是停止进程,kill -l查看指令信息,kill -9的意思就是执行9号命令
创建n个子进程:
程序不退出查看效果
循环创建n个子进程控制顺序:
用for循环创建了五个子进程,当想让这五个子进程按顺序退出的话就应该加上控制语句sleep(i),原理是每个子进程在for循环之后的i的值都不同,那么就可以按照i的值进行顺序退出,最后再退出父进程(循环结束父进程的i为5)。
\n栓刷新行缓冲区
task_struct和mm_struct和pcb:
-
pcb在内核区
-
task_struct是进程描述符,mm_struct虚拟内存描述符,描述虚拟地址空间
-
pcb用task_struct来描述
父子进程进程共享内容:
exec族函数:程序替换
-
int execl( const char *path, const char *arg, …);
-
int execlp( const char *file, const char *arg, …);
-
带p指PATH,意思就是不用指定路径直接去环境变量目录下找
-
file要执行的程序
-
arg参数列表
-
》参数列表最后需要一个NULL最为结尾,哨兵
-
返回值: 只有失败才返回,一般执行系统命令,ls cat
这两个函数实现的是相同的功能
关于exec族函数的原型即基本用法举例:
exec函数族内部系统调用关系,我们写好的函数会被系统改变并且调用其他的函数
当我们执行一条命令的时候,其实是shell创建了一个子进程,然后父进程保持不变,子进程去执行命令,那具体怎么执行呢?就是调用exec族里面的execlp函数进行操作,代码在上面截图里面。
这里我们实现一下文件的替换:
首先从手册中知道第一个参数是待执行的程序的路径,也就是说已经编译好了就是等待执行,第二个参数就是你打算如何操作这个儿可执行程序的命令