1:程序是静态的,它包括代码段,数据段(栈,普通数据区,堆区);
2:进程是程序的一次运行过程,即运行一次产生一个进程,运行两次产生两个进程;
3:进程存在一些状态的变化,他是动态的;
4:进程不仅包括程序的代码段,数据段内容,还有其他资源(因为要运行这个进程),如:一些系统数据,pc指针;
5:进程管理属于内核层,内核层的主要功能是设备驱动,进程管理,文件管理和网络通信。
二:进程的相关命令:
1:ps
权限:所有用户
命令格式:ps[选项]
功能:查看系统中的进程状态
eg:ps -axj ; //运行结果为系统中的进程
2:kill
权限:所有用户
命令格式:kill[选项][进程号]
功能:发送指定的信号给指定的进程或进程组
常用选项: -l :查看有哪些信号,eg:kill -l
-9:结束进程(包括后台进程),如:kill -9 pid
三:创建子进程函数fork和vfork
1:fork函数
头文件:#include<sys/types.h>
功能:创建一个子进程
参数:没有参数
返回值:成功返回两个值。子进程中为0;父进程中为大于0 的值(子进程的pid号),出错则返回一个值-1.
成功时,内核为何会返回两个值?
这是因为用户空间的进程可以认为是一个封闭的房子(在用户空间),内核通过PID对用户空间的进程进行管理。fork函数调用成功后,内核则在用户空间创建一个新进程(房子),这个房子和之前的进程代码段,数据段等都一样(除了PID之外)。因此,当函数执行成功时,在父进程和子进程中返回两个不同的值。
产生的子进程在父进程原有的运行基础上继续运行,这样就能保证一个fork函数只能产生一个子进程,而不是多个子进程;
在一个main中若存在n个fork();则最终将产生2^n个进程。
注意:fork函数成功执行后,父进程和子进程的执行没有固定的先后顺序,这是因为CPU在微观上是串行执行,宏观上是并行执行。即CPU在一个时间片里运行一个进程,在另一个时间片里运行另一个进程,从而导致这两个进程交替运行,且运行顺序随机未知。
2:vfork函数
vfork函数也跟fork函数一样。vfork函数执行成功后,内核也在用户空间创建一个进程,但不会重新建造一个房子,父子进程共享父进程这个房子,同时子进程先执行,父进程后运行。
3: fork(