如果你学过C语言,你应该有以下认识:
一个C程序由很多函数组成,一个函数可以调用另一个函数,同时传递给它一些参数。
同样main函数也是如此
被调用的函数会执行一定的操作,然后通过特定的操作返回一个值。
每个函数都有它自己的局部变量,也会有自己独立的存储空间。
不同函数在汇编语言中通过call/return系统进行“通信”。
c语言中的函数通过参数和返回值,在拥有私有数据的函数间“通信”的模式是结构化程序设计的基础,Linux鼓励将这种应用于程序之内的模式扩展到程序之间。
在一个C程序可以fork/exec另一个程序,其过程是先fork一个子进程,然后让子进程使用exec系列函数将子进程的代码和数据替换为另一个程序的代码和数据,之后子进程就用该程序的数据执行该程序的代码,从而达到程序之间相互调用的效果。
pid_t id = fork();
if (id == 0){
execvp(proc[0], myargv);
exit(1);
}
当这个被调用的程序执行完毕后,通过exit(n)来返回一个值。调用它的进程可以通过wait或waitpid来获取这个返回值(避免僵尸进程)。
wait(&status);
waitpid(id, &status, 0);
那这时候就要说了,这在前面的内容中多少都已经了解,那么这里为什么又进行提到了呢?这里又有什么特别之处吗?
那么下面就将这部分内容扩展。
那么我们在C语言中也应该可以用fork/exec系列函数调用shell脚本、python以及C++等语言实现的程序,来进行上述类似操作。
比如下面的操作:
我们先在同一目录下创建如下的文件:
然后在对应的文件内添加如下的代码:
!/bin/bash
echo "Hello from Shell Script!"
print("Hello from Python Script!")
include
include
int main() {
// 调用 Shell 脚本
printf("Calling Shell Script...\n");
int shell_status = system("./script.sh");
if (shell_status == 0) {
printf("Shell Script executed successfully.\n");
} else {
printf("Failed to execute Shell Script.\n");
}
// 调用 Python 脚本
printf("\nCalling Python Script...\n");
int python_status = system("python3 script.py");
if (python_status == 0) {
printf("Python Script executed successfully.\n");
} else {
printf("Failed to execute Python Script.\n");
}
return 0;
}
赋予bash执行权限:
chmod +x script.sh
gcc main.c -o main
./main
原理解析
system() 是一个标准 C 库函数,用于执行系统命令。
system("./script.sh") 调用 Shell 脚本。
system("python3 script.py") 调用 Python 脚本。
Shell 脚本需要设置可执行权限(chmod +x script.sh)。
Python 脚本则通过 python3 解释器执行。
system() 返回 0 表示命令成功执行,非 0 表示执行失败。