如果你只学了C语言、C++或是JAVA等高级语言,你可能只知道函数间可以相互调用,但当你学习了进程的相关知识后,你的视野也就不止于此了,因为各个程序之间其实也是可以相互调用的。
如果你学过C语言,你应该有以下认识:
- 一个C程序由很多函数组成,一个函数可以调用另一个函数,同时传递给它一些参数。
- 被调用的函数执行一定的操作,然后返回一个值。
- 每个函数都有它自己的局部变量。
- 不同函数通过call/return系统进行通信。
这种通过参数和返回值,在拥有私有数据的函数间通信的模式是结构化程序设计的基础,Linux鼓励将这种应用于程序之内的模式扩展到程序之间。
一个进程可以使用fork创建一个子进程,然后使用exec系列函数将子进程的代码和数据替换为另一个程序的代码和数据,之后子进程就用该程序的数据执行该程序的代码,从而达到程序之间相互调用的效果。
pid_t id = fork();
if (id == 0){
execvp(myargv[0], myargv);
exit(1);
}
当这个被调用的程序执行完毕后,通过exit(n)来返回一个值。调用它的进程可以通过wait或waitpid来获取这个返回值。
wait(&status);
waitpid(id, &status, 0);
程序之间相互调用带来的好处之一
我们都知道各个语言有自己独特的优势,当我们做某一技术开发时,可能需要用到多种语言,而我们最终就是利用程序之间的相互调用使得各个语言之间可以进行衔接。
例如,一个C程序可以通过exec系列函数调用shell脚本、python以及C++等语言实现的程序。
shell脚本:
python:
C++:
我们使用以下C程序,便可以分别调用以上三个程序。
调用shell脚本运行结果:
调用python运行结果:
调用C++运行结果: