本文共 1289 字,大约阅读时间需要 4 分钟。
exec族函数用于将fork()生成的子进程的.text和.data段替换为目标进程的.text和.data段。这种机制被称为“换核不换壳”,因为在这个过程中并没有产生新的进程,而是直接替换了现有进程的内存空间。
在Linux系统中,进程的产生遵循以下步骤:
// main.c#includeint main() { printf("Hello World!\n"); return 0;}
gcc -o main main.c
./main
在这一过程中,bash实际上是一个进程,而执行./main时,系统会调用fork()生成一个子进程。由于fork()创建的是一个完全独立的进程,子进程的虚拟地址空间与父进程几乎完全相同,包括.text和.data段。
exec族函数用于替换子进程的.text和.data段,实现进程替换。常用的函数包括:
这些函数的参数包括:
这些函数的特点是没有成功返回值,执行成功后不会返回。失败时返回-1,且调用失败后,程序会继续执行原始调用点。
if (pid == 0) { // 子进程中 execlp("/bin/ls", "ls", "-a", NULL);}// 父进程中char *argv[] = {"ls", "-l", "-a", NULL};if (pid == 0) { execv("/bin/ls", argv);} 在上述伪代码中:
这些函数不仅可以加载系统进程,也可以加载用户自定义的进程,使用方法相同。
通过以上内容,可以看出进程替换的核心在于替换进程的.text和.data段,而不是创建新的进程。
转载地址:http://xmyd.baihongyu.com/