fork()函数与exec族函数小谈

/*
 *函数功能:子进程启动已存在的一个程序
 * */


#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函数,则启动进程会替代原有进程,而且不会返回

















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值