首先创建一个进程有两种做法,fork()和execve()他们都是系统调用,但是运行方式不同。
创建一个进程可以使用fork系统调用,然后子进程会得到父进程的数据段,栈段和堆区的一份拷贝,子进程可以独立修改这些内存段,但是文本段是父进程和子进程的共享段,子进程不能修改;
如果使用execve创建一个进程,这个系统会销毁所有的内存段去创建一个新进程,execve和fork创建的进程都是运行进程的子进程
一.fork
(1)父子进程谁先运行不知道,由调度器决定,但是我们期望子进程先结束
(2)Ls文件重定向:运行结果本应该显示在显示器上的,用了文件重定向后结果显示在文件当中
(3)需要注意的是:rm -rf是一个伪目标,伪目标也是目标文件,但是它根据依赖方法生成目标文件的时候,并不会实际生成文件,而只是执行它的方法
(4)程序运行结果:
第一次执行完成之后有两个进程,父进程和子进程
第二次执行完成之后子进程会生成两个进程,之前的父进程也会生成两个进程
所以这个循环结束之后一共生成六个进程
子进程是父进程的副本,例如子进程获得父进程的数据空间‘堆栈空间,父进程不共享这些存储空间部分。父子进程共享正文段;
二.vfork
vfork也是用于创建一个进程,但它不会将父进程的地址空间复制到子进程中,相反在子进程调用exec或exit之前它在父进程的地址空间运行,也就是说会更改父进程的数据段,堆,栈,vfork与fork的另一个区别在于vfork保证子进程先运行,在它调用exec或exit之后父进程才有运行。
原文地址:http://10808695.blog.51cto.com/10798695/1793477