欢迎来到Cefler的博客😁
🕌博客主页:那个传说中的man的主页
🏠个人专栏:题目解析
🌎推荐文章:题目大解析(3)
目录
- 👉🏻进程的程序替换概念
- 👉🏻六个替换函数
- 👉🏻单进程版的程序替换的代码(没有子进程)--见见程序替换
- 👉🏻程序替换我们自己写的程序
- 👉🏻程序替换Shell脚本
- shell脚本概念
- 程序替换
👉🏻进程的程序替换概念
之前我们所创建的所有的子进程,执行的代码,都是父进程代码的一部分,如果我们想让子进程执行新的程序,不再和父进程有瓜葛了。这时我们就引入——
程序替换
程序替换
程序替换
🌞概念
在Linux中,进程控制的程序替换是指一个进程用另一个新程序来替换自己的执行映像。这个新程序完全取代了原来的程序,包括代码、数据和堆栈等信息,成为了新的运行中的进程。这种程序替换的操作通常是通过调用exec
函数来完成的。
程序替换常用于创建新的进程或者更新正在运行的进程的执行映像。例如,在一个Shell中,当你输入一个命令时,Shell就会创建一个新的进程来执行相应的程序。在这种情况下,Shell就会调用fork
创建一个新的子进程,然后在子进程中调用exec
来加载并执行新的程序。
程序替换的一个重要特点是原有的进程ID(PID)不会改变,这意味着虽然进程的执行映像已经被替换,但是它仍然保持着原来的PID。这样做的好处是可以保持一些与PID相关的状态,比如父子进程关系、进程的权限等。
总之,Linux中进程控制的程序替换是通过exec
函数来实现的,它允许一个进程用另一个程序来替换自己的执行映像,从而创建新的进程或者更新正在运行的进程的执行映像。
👉🏻六个替换函数
在Linux中,有多个替换函数可用于执行其他程序。下面是对这些函数的介绍:
execl
:该函数用于在当前进程中执行一个可执行文件。它接受可执行文件的路径和一系列的参数作为参数,并将当前进程替换为新的可执行文件。这个函数的原型如下:
这个函数在执行成功后不会返回,如果调用失败,则会设置errno并返回-1[1]。#include <unistd.h> int execl(const char *path, const char *arg, ...);
-
execlp
:与execl
类似,但是它可以在系统的PATH
环境变量指定的路径中搜索可执行文件。这个函数的原型如下:#include <unistd.h> int execlp(const char *file, const char *arg, ...);
同样地,这个函数在执行成功后不会返回,如果调用失败,则会设置errno并返回-1[1]。
-
execle
:这个函数与execl
类似,但是它还接受一个额外的参数envp
,用于指定新程序的环境变量。这个函数的原型如下:#include <unistd.h> int execle(const char *path, const char *arg, ..., char * const envp[]);
同样地,这个函数在执行成功后不会返回,如果调用失败,则会设置errno并返回-1[1]。
-
execv
:与execl
类似,但是它接受一个参数数组来传递可执行文件的路径和参数。这个函数的原型如下:#include <unistd.h> int execv(const char *path, char *const argv[]);
同样地,这个函数在执行成功后不会返回,如果调用失败,则会设置errno并返回-1[1]。
execvp
:与execv
类似,但是它可以在系统的PATH
环境变量指定的路径中搜索可执行文件。这个函数的原型如下:
同样地,这个函数在执行成功后不会返回,如果调用失败,则会设置errno并返回-1[1]。#include <unistd.h> int execvp(const char *file, char *const argv[]);
execve
:与execv
类似,但是它还接受一个额外的参数envp
,用于指定新程序的环境变量。这个函数的原型如下:
同样地,这个函数在执行成功后不会返回,如果调用失败,则会设置errno并返回-1[1]。#include <unistd.h> int execve(const char *path, char *const argv[], char *const envp[]);
这些以exec开头的函数,统称exec函数
- 这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回。
- 如果调用出错则返回-1
- 所以exec函数只有出错的返回值而没有成功的返回值
这些替换函数可以在创建新进程后,用于在新进程中执行另一个程序。当调用这些函数时,当前进程会被完全替换为新程序。这些函数的区别在于参数的传递方式和对环境变量的处理方式。通过这些函数,我们可以方便地在Linux中执行其他程序并传递参数[1]。
exe函数
的本质就是加载器,将磁盘中的程序加载到内存中!
👉🏻单进程版的程序替换的代码(没有子进程)–见见程序替换
代码:
#include<stdio.h>
#include<unistd.h>
int main()
{
printf("pid:%d,exe command begin\n", getpid());
execl("/usr/bin/pwd", "pwd", NULL);
printf("pid:%d,exe command end\n", getpid());
return 0;
}
result:
原理解释:
👉🏻程序替换我们自己写的程序
首先在Makefile文件中使得make能一次性创建两个可执行程序
创建mytest.cc:
myprocess.c:
the result:
👉🏻程序替换Shell脚本
shell脚本概念
当谈论Linux的Shell脚本文件时,我们实际上指的是一种文本文件,其中包含了一系列的Shell命令,这些命令按照特定的顺序被解释器(比如bash、sh等)逐行执行,就像在命令行中一行行输入命令一样。
下面是一个简单的Shell脚本例子,它将会创建一个包含当前日期和时间的文件,并显示一条消息:
#!/usr/bin/bash
# 这是一个简单的Shell脚本
# 显示一条消息
echo "hello shell"
让我们来解释一下这个例子:
-
#!/usr/bin/bash
:这是脚本文件的第一行,称为shebang,用来告诉系统使用哪个解释器来执行脚本。在这个例子中,#!/usr/bin/bash
告诉系统使用Bash来解释执行脚本。 -
#
开头的行是注释,用来对脚本进行说明,不会被解释器执行。 -
echo "hello shell"
:这一行使用echo
命令在终端上显示一条消息。
要注意的是,为了使一个Shell脚本文件可以被执行,你需要先将其设置为可执行文件。你可以使用chmod +x script.sh
命令来赋予这个Shell脚本文件执行权限。
总的来说,Linux的Shell脚本文件是一种包含了一系列Shell命令的文本文件,它可以用来自动化执行一系列任务,非常适合用于批处理、系统管理和自动化部署等场景。
程序替换
script.sh:
myprocess.c
the result:
如上便是本期的所有内容了,如果喜欢并觉得有帮助的话,希望可以博个点赞+收藏+关注🌹🌹🌹❤️ 🧡 💛,学海无涯苦作舟,愿与君一起共勉成长