exec函数记录

exec简介:

exec家族的函数,用来运行新的进程替换当前的进程。执行后,新进程加载到内存,父进程的静态变量在新的进程中当然是不可见。新进程可以继承父进程的句柄和环境变量,用户组。

示例

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int g_value = 0;
int main(int argc, char **argv) 
{
    if (argc > 1 && strcmp(argv[1], "child") == 0) {
        printf("child g_value = %d\n", g_value);
        return 0;
    }
    g_value = 1;
    printf("father g_value = %d\n", g_value);
    int fd = open("/root/source/test.txt", O_RDWR);
    printf("father fd = %d\n", fd);
    dup2(fd, 1);
    close(fd);
    execl("/root/source/cmd", "cmd", "child", NULL);
    printf("run child failed\n");
    return 0;
}

如上代码编译一个cmd的二进制,执行cmd命令,
1、父进程将g_value 赋值为1,子进程中g_value 依然为0,子进程不会继承父进程的变量。
2、将标准输出的句柄绑定到/root/source/test.txt句柄。子进程的句柄依然指向/root/source/test.txt,子进程可以继承父进程的句柄。

root@yisu-66a113137e504:~/source# ./cmd
father g_value = 1
father fd = 3
root@yisu-66a113137e504:~/source# 
root@yisu-66a113137e504:~/source# cat test.txt 
child g_value = 0

这里顺带提一下fork,fork功能是创建一个新的进程,子进程获得父进程代码段和数据段的副本(虽然在现代系统中,通常使用写时复制技术来优化内存使用)。子进程继承父进程的资源限制(如文件大小限制、CPU 时间限制等)。
fork和execv的组合可实现子进程的管理,如fork创建一个新的进程,设置它的uid,gid后,再执行execv切换新进程替换当前进程。

android service启动

android service启动,使用到了fork 和 execv:

Result<void> Service::Start() {
    //....
    pid = fork();
   if (pid == 0) {
         RunService(...); // 其中执行 execv 加载新的程序,并设
   }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 大师兄的Python学习笔记(四): Python的内置函数大师兄的Python学习笔记(六): 常用库之sys包...
    superkmi阅读 2,101评论 0 52
  • exec 曾提及用fork函数创建新的子进程后,子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种e...
    MachinePlay阅读 2,160评论 0 0
  • fork()函数通过系统调用创建一个与原来进程(父进程)几乎完全相同的进程(子进程是父进程的副本,它将获得父进程数...
    饭饭H阅读 1,143评论 0 0
  • 1.创建进程 fork函数创建进程 注意:1.创建成功时候,父进程返回子进程的进程号,子进程返回02.通过fork...
    Meiyangyang945阅读 506评论 2 1
  • fork() fork()将父进程复制一份子进程, 在子进程中从fork()调用处继续执行, 之后的代码在父子进程...
    D_Major阅读 3,185评论 0 0

友情链接更多精彩内容