函数和进程之间的相似性

简介: 在一个C程序可以fork/exec另一个程序,其过程是先fork一个子进程,然后让子进程使用exec系列函数将子进程的代码和数据替换为另一个程序的代码和数据,之后子进程就用该程序的数据执行该程序的代码,从而达到程序之间相互调用的效果。在学了C语言、C++或是JAVA等高级语言,你会知道,在这些语言中的函数是可以相互进行见调用的,但是在学习了Linux的前面的知识后,你就会有意无意的认识到其实进程也是与函数有相同之处的,进程之间也是可以相互调用的。程序之间相互调用带来的好处之一。那么下面就将这部分内容扩展。

如果你学过C语言,你应该有以下认识:

一个C程序由很多函数组成,一个函数可以调用另一个函数,同时传递给它一些参数。
同样main函数也是如此
被调用的函数会执行一定的操作,然后通过特定的操作返回一个值。
每个函数都有它自己的局部变量,也会有自己独立的存储空间。
不同函数在汇编语言中通过call/return系统进行“通信”。
c语言中的函数通过参数和返回值,在拥有私有数据的函数间“通信”的模式是结构化程序设计的基础,Linux鼓励将这种应用于程序之内的模式扩展到程序之间。
image.png

在一个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 表示执行失败。

目录
相关文章
|
Linux
进程等待(wait和wait函数)【Linux】
进程等待(wait和wait函数)【Linux】
226 0
|
7月前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
264 13
|
10月前
|
Linux C语言
C语言 多进程编程(三)信号处理方式和自定义处理函数
本文详细介绍了Linux系统中进程间通信的关键机制——信号。首先解释了信号作为一种异步通知机制的特点及其主要来源,接着列举了常见的信号类型及其定义。文章进一步探讨了信号的处理流程和Linux中处理信号的方式,包括忽略信号、捕捉信号以及执行默认操作。此外,通过具体示例演示了如何创建子进程并通过信号进行控制。最后,讲解了如何通过`signal`函数自定义信号处理函数,并提供了完整的示例代码,展示了父子进程之间通过信号进行通信的过程。
|
10月前
|
编译器
【收藏】内核级利用通用Hook函数方法检测进程
【收藏】内核级利用通用Hook函数方法检测进程
|
11月前
|
Linux API
Linux源码阅读笔记07-进程管理4大常用API函数
Linux源码阅读笔记07-进程管理4大常用API函数
|
运维 JavaScript Serverless
Serverless 应用引擎产品使用合集之函数计算里中FC出现函数还没有执行完进程就关闭了是什么导致的
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
Linux Shell 程序员
【进程控制】进程程序替换的原理以及exec函数族
【进程控制】进程程序替换的原理以及exec函数族
|
存储 算法 Unix
【创建进程】fork函数与写时拷贝
【创建进程】fork函数与写时拷贝
|
消息中间件 Unix Linux
【探索Linux】P.14(进程间通信 | 匿名管道 | |进程池 | pipe() 函数 | mkfifo() 函数)
【探索Linux】P.14(进程间通信 | 匿名管道 | |进程池 | pipe() 函数 | mkfifo() 函数)
187 0