/*
*函数功能:子进程启动已存在的一个程序
* */
#include <apue.h>
#define MYPATH "/usr/bin/gedit"
#define MYPRO "gedit"
int main(int ac,char **av,char *envp[]) //最后一个是环境变量
{
pid_t chid = -1;
chid = vfork(); //给子进程返回0,给父进程返回大于0的ID
if(0 > chid){
//error
}else if(0 == chid){
int rst = -1;
//char *envp[2] = {"HOME=/home",NULL}; //两种方式都可以
rst = execle(MYPATH,MYPRO,NULL,envp); //exec族函数有很多,参数具体大同小异
if(-1 == rst){
//error
}
exit(0);
}else{
printf("execle excued\n");
}
return 0;
*函数功能:子进程启动已存在的一个程序
* */
#include <apue.h>
#define MYPATH "/usr/bin/gedit"
#define MYPRO "gedit"
int main(int ac,char **av,char *envp[]) //最后一个是环境变量
{
pid_t chid = -1;
chid = vfork(); //给子进程返回0,给父进程返回大于0的ID
if(0 > chid){
//error
}else if(0 == chid){
int rst = -1;
//char *envp[2] = {"HOME=/home",NULL}; //两种方式都可以
rst = execle(MYPATH,MYPRO,NULL,envp); //exec族函数有很多,参数具体大同小异
if(-1 == rst){
//error
}
exit(0);
}else{
printf("execle excued\n");
}
return 0;
}
小结:
fork()和vfork()以及clone()都是创建进程的函数,子进程,父进程开始共享全局变量 .data段,.bss段
text段,当子进程要对数据空间进行修改时,则系统采用 ”写时复制“ 技术,子进程复制拷贝父进程空间,一个进程在现代计算机操作系统
都分配有一个虚拟存储空间,在计算机中的内存中都有相应的段结构,所以子进程会完全拷贝父进程的代码段(.text),数据段(.data)
tips:现代操作系统都采用“段页式”管理内存
fork()和vfork()的主要区别:
fork()子进程和父进程存在竞争,谁先执行存在不确定关系
vfork()则是父进程执行完后,子进程才执行
一般子进程退出后,父进程要进行回收,如父进程没有及时回收,则子进程称为僵尸进程,还留有残留空间(未被空间回收的空间,其他进程又不能访问的垃圾区)
如果父进程也结束了,则在linux上是1号进程回收如rehat7.0是systemmd号进程
如果一旦启用了系统族exec函数,则启动进程会替代原有进程,而且不会返回