一起talk C栗子吧(第一百三十五回:C语言实例--exec系列函数一)

本文主要是介绍一起talk C栗子吧(第一百三十五回:C语言实例--exec系列函数一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


各位看官们,大家好,上一回中咱们说的是“创建线程时的内存细节”的例子,这一回咱们说的例子是:exec系列函数。闲话休提,言归正转。让我们一起talk C栗子吧!

看官们,我们在前面介绍创建进程内存细节的章回中提到过exec系列函数,当时并没有做详细的介绍。今天我们将和大家一起看看exec系列函数。

exec系列函数可以把某个进程导入到调用exec系列函数的进程中,并且把当前进程替换成一个新的进程,在前面的章回中我们也介绍了,执行exec系列函数会触发写时复制,因此新进程拥有自己的代码区,数据区,堆区和栈区。

我们先从exec系列函数中选取一个函数来介绍,这样可以让大家有个直观的印象。下面是exec系列函数中的一个函数execlp,它的函数原型如下:

 int execlp(const char *file, const char *arg, ...)
  • 函数中的第一个参数是文件名,表示可执行文件名或者脚本文件名;
  • 函数中的第二个参数是传递给可执行文件的参数,它会传递给可执行文件中main函数的argv[];
  • 函数中的参数数量是可变的,不过最后一个参数总是空指针;
  • 函数运行成功时没有返回值,运行错误时返回-1.

接下来, 我们通过实际的代码来说明如何使用该函数。下面是详细的代码,请大家参考:

#include<unistd.h>
#include<stdio.h>int main()
{pid_t pid;pid_t pid_res;int stat_value;pid = fork();if(pid > 0){printf("PID: %d -> Father Process is running \n",getpid());pid_res = wait(&stat_value);if(pid_res > 0){printf("Son process finished: PID = %d \n",pid_res);}}else if(pid == 0){printf("PID: %d -> Son Process is running \n",getpid());execlp("echo","echo","hello",NULL);  //运行execlp函数}else{printf("Create process failed \n");return 1;}return 0;
}

上面的代码通过fork创建一个子进程,然后在子进程中执行execlp函数。我们重点看一下execlp函数的用法。

传递给函数的第一个参数是可执行文件名echo,第二个和第三个参数是”echo”和”hello”。这两个参数都会传递给可执行文件中(这里是echo)main函数的argv[]。最后一个参数是空指针,它也会传递给argv[]。这时候,我们来看看argv[]中的内容。

  • argv[0]中的内容是”echo”;
  • argv[1]中的内容是”hello”;
  • argv[2]中的内容是”NULL”,它是命令结束标志。

可执行文件有了,可执行文件的参数也有了,真是万事俱备,只欠东风呀。看官莫急,东风来了,execlp函数就是东风,它会到系统的环境变量中查找可执行文件”echo”,并且把argv[]中的参数传递给它,然后运行该可执行文件。

下面是程序的运行结果,请大家参考:

PID: 4194 -> Father Process is running 
PID: 4195 -> Son Process is running 
hello                                 //execlp函数把echo导入到当前进程中运行,并且输出运行结果
Son process finished: PID = 4195 

我们也可以在终端中单独运行echo命令,下面是运行该命令的结果:

$ echo 'hello'  //在终端中单独运行echo命令
hello           //显示命令运行的结果

从上面的结果中,我们可以看到,它和刚才程序的运行结果是一致的。

各位看官,关于exec系列函数的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解 。


这篇关于一起talk C栗子吧(第一百三十五回:C语言实例--exec系列函数一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/800201

相关文章

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

全面掌握 SQL 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

MySQL count()聚合函数详解

《MySQLcount()聚合函数详解》MySQL中的COUNT()函数,它是SQL中最常用的聚合函数之一,用于计算表中符合特定条件的行数,本文给大家介绍MySQLcount()聚合函数,感兴趣的朋... 目录核心功能语法形式重要特性与行为如何选择使用哪种形式?总结深入剖析一下 mysql 中的 COUNT

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的