一起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系列函数的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解 。


时间: 2024-10-18 02:11:08

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

一起talk C栗子吧(第一百三十二回:C语言实例--从内存的角度看进程和线程)

各位看官们,大家好,上一回中咱们说的C程序内存布局的例子,这一回咱们说的例子是:从内存的角度看进程和线程.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们刚刚介绍完C程序的内存布局,我们趁热打铁,从内存的角度来分析一下进程和线程. 不管是进程还是线程,他们都会加载到内存中才能运行,因此他们在内存中的布局和其它C程序的内存布局完全相同.进程和线程的内存布局也分为代码区,数据区,堆区和栈区. 对进程来说,父子进程只共享代码区中的内容,父子进程拥有各自的数据区,堆区和栈区.而且它们只能

一起talk C栗子吧(第一百二十二回:C语言实例--多线程)

各位看官们,大家好,上一回中咱们说的是线程知识体系图的例子,这一回咱们说的例子是:多线程.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我首先给大家拜个晚年,祝大家在新的一年里身体健康,万事如意. 今天我们介绍一下多线程,我相信大家都听过这个名词,但是具体的含义是什么呢?其实多线程是指两个或者两个以上的线程在一起运行,他们共同完成某个工作. 我们在前面的章回中介绍过使用pthread_create()函数去创建线程.如果想使用多线程,那么只需要多次使用该函数去创建线程就可以.接下来

一起talk C栗子吧(第一百三十四回:C语言实例--创建线程时的内存细节)

各位看官们,大家好,上一回中咱们说的是"创建进程时的内存细节"的例子,这一回咱们说的例子是:创建线程时的内存细节.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在前面章回中介绍过创建线程的例子,创建线程时使用的函数是pthread_create.今天我们一起说一下使用该函数创建线程时内存的一些细节问题.我们介绍的的重点还是内存布局中的四个分区.这点和前一回中介绍创建进程时内存细节的思路相同. 1.在主线程中使用pthread_create函数可以创建一个新线程,我们叫

一起talk C栗子吧(第一百七十五回:C语言实例--获取当前终端的行数和列数)

各位看官们,大家好,上一回中咱们说的是关闭终端中缓冲功能的例子,这一回咱们说的例子是:获取当前终端的行数和列数 .闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在前面章回中介绍了termios相关的信息,以及termios提供的编程接口,通过这些接口可以操作终端,今天我们再介绍一些操作终端的编程接口,通过这些接口可以获取当前终端的行数和列数,这便是我们今天的主题. int setupterm(char *term, int fd, int *errret); 该函数用来修改当前

一起talk C栗子吧(第一百六十五回:C语言实例--C语言中的常量)

各位看官们,大家好,上一回中咱们说的const关键字的例子,这一回咱们说的例子是:C语言中的常量 .闲话休提,言归正转.让我们一起talk C栗子吧! 看官们, 我们在上一回中介绍了const关键字,大家都知道被const修饰的都是常量.提到常量,我们在程序中经常使用它,这一回中我们一起看看C语言中的其它常量. 大家都知道,常量的值是固定的,而且不能被修改.在C语言中,一共有四种实现常量的方式,它们分别是: 字面常量 宏 const 枚举. 接下来我们分别介绍这四种实现常量的方式. 字面常量:字

一起talk C栗子吧(第一百六十二回:C语言实例--套接字知识体系图)

各位看官们,大家好,上一回中咱们说的是套接字通信模型的例子,这一回咱们说的例子是:套接字知识体系图.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们, 我们在前面的章回中介绍了许多关于套接字的内容,有些看官感觉知识比较乱,不断地摇头叹气,而且还在吟诗:剪不断,理还乱,是离愁.不对,是套接字.别有一番滋味在心头.哈哈.这位看官太有才了呀,连古诗也用上了.今天我和大家一起整理下套接字的知识,到时候将会是一番喜悦的滋味在心头. 看官们,我们最开始介绍的是套接字的概念,接着介绍了套接字的属性,

第一百三十五天 how can i 坚持

多半天都在买鱼了.好累.最后买了两对孔雀鱼,两条米奇.结果,回到家米奇死了一条啊,好可惜. 感觉. 放不下怎么办,今天应该给李有才打个电话的,结果成了这个样子,把刘路叫了出来.聊着聊着就没有时间打了.哎,为什么会这样,连这个勇气都没有. 该怎么办呢. 路在何方.加油.努力.找寻自己的方向和梦想. 天津爆炸死了85个人了.生命啊. 睡觉.

第一百三十五节,JavaScript,封装库--拖拽

JavaScript,封装库--拖拽 封装库新增1个拖拽方法 /** tuo_zhuai()方法,将一个弹窗元素实现拖拽功能 * 注意:一般需要在css文件将元素里的某一个区块光标设置成提示可以拖拽,如:cursor: move; * 无参 **/ feng_zhuang_ku.prototype.tuo_zhuai = function () { if (this.jie_dian.length == 1) { var yan_su = null; for (var i = 0; i < th

小刘同学的第一百三十五篇日记

今天大致把论文改完了. 还剩一章的内容,明早大概2个小时就能改完整片论文了. 今天收到录用通知了-- 感觉很殇--可能要去小县城上班去了. 而且也不是做技术-- 不知道后面的路会怎么样, 牢记使命,不忘初心吧( ̄▽ ̄)~* 大家早安~ morning~ 原文地址:https://www.cnblogs.com/xiaoliutongxue/p/9022457.html