1.进程概念
进程是一个动态实体,他是操作系统分配资源的最小单位,是程序的一次执行过程。
2.进程标识
操作系统中每个进程都可以使用一个ID来进行标志的,即进程ID,该ID是一个非负数可以通过相应函数获得
getpid 获得进程ID
getppid 获得父进程ID
getuid 获得进程的实际用户ID //获得运行程序的用户ID
geteuid 获得进程的有效用户ID //某个用户A,运行了一个程序,而该程序是以root身份运行的,该程序拥有root权限实际用户ID为root ID
getgid 获得进程实际组ID //运行程序用户的组ID
getegid 获得进程有效组ID //程序的实际用户ID的组ID
3.linux进程结构
一个进程是由代码段,数据段,堆栈段,数据段中存放的是全局变量,常量,静态变量。堆栈段存放的是局部变量,和动态分配的内存变量。
4.linux进程状态
运行状态 进程正在运行
可中断等待状态 程序正在等待某个事件完成
僵死状态 进程已终止,知道父进程wait 函数后释放
停止状态 进程因为收到信号后停止运行或者该进程正在被跟踪。
这样我们就获得了关于进程的所有标识,我在想fork函数应该只是对当前进程的拷贝,拷贝之后,父进程和子进程之间共享的应该是代码段,而堆栈段和数据段则是不同的,也
就是说父进程和子进程的运行轨迹是一样的,但是数据却是不同的。
fork函数的返回值是有两个的,其中一个是子进程的返回值,是0
另外一个则是在父进程的返回值,他返回的是子进程的ID值
当然如果失败的话,返回的是-1,其错误值放在errno当中,而excel则会指定用文件创建的。
vfork函数并不是复制父进程的地址空间,而是共享父进程的地址空间,也就是说,子进程完全运行在父进程的地址空间商,子进程对改地址空间中的修改对父进程也是可见的
fork创建一个子进程时,那个进程先运行,取决于系统的调度算法,而vfork函数创建的子进程则会保证子进程先运行,当他调用exec或者exit之后父进程才会被调度运行,如果
子进程运行时依赖父进程的某个行为,则会导致死锁
这里借用别人的代码讲述下自己的理解,或者说是看了讲解之后自己的理解吧
vfork创建的进程之后立即执行子进程,也就是fd返回是0的代码段,也就是立即打印的是Here is child
然后呢就是创建新的进程localtime,创建完成之后子进程结束,打印Here is father and child is ...(这期间不用去管localtime程序是否执行完成,创建成功就是vfork的子进程结
束)这样呢,localtime的父进程结束了,localtime也就成了孤儿进程。由init收养,也就是说,localtime进程的父进程成为了init进程