Linux15 进程替换

进程替换:

        使用 fork 函数创建子进程的时候,和父进程执行的是相同的程序。但是实际在我们的期望中,子进程应该是执行和父进程不同的代码。所以此时,子进程往往要调用 exec函数从而执行另一个程序。调用 exec 并不创建新的进程,所以调用 exec 函数并不会改变该进程的 pid。

      被替换的用户的代码和数据完全被新的程序替换,并从新的程序的启动例程开始执行。

  • exec函数

int exec函数族,只有出错的时候才会有返回值。

path是路径。

argv是main函数传的参数,个数由底层自己算出。

 

5个库函数底层都是由系统调用实现的。这些函数的名字也是有一定规律的

l (list) : 表示参数使用列表    v (vector) : 参数使用数组

p(path) : 自动搜索环境标量     e(env) :需要自己去维护环境变量

exec.c

int main(int argc,char*argv[],char*envp[])

{

    printf("main pid=%d\n",getpid());
    //execl("/bin/ps","ps","-f",(char*)0);
    //execlp("ps","ps","-f",(char*)0);
    //execle("/bin/ps","ps","-f",(char*)0,envp);
    char* myargv[10]={"ps","-f"};
    char* myenvp[10]={"MYSTR=hello","MYPAHY=/bin"};

    //execv("/bin/ps",myargv);
    //execvp("ps",myargv);
    //execve("/bin/ps",myargv,envp);
    //execl("./cy","cy","hello","123",(char*)0);
    execle("./cy","cy","hello","123",(char*)0,myenvp);

    perror("exec error");
    exit(0);

}

cy.c

int main(int argc,char *argv)
{
    printf("cy main pid =%d\n",getpid());
    printf("argc =%d\n",argc);

    int i=0;
    for(i=0;i<argc;i++)
    {
        printf("arv[i]=%s\n",i,argv[i]);
    }
    for(i=0;envp[i]!=NULL;i++)
    {
        printf("envp[i]=%s\n",i,envp[i]);
    }
}

exec后子进程变成了一个新进程,不再和父进程共享文件描述符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值