Linux -- system、.(source)、exec的区别

这两天在项目中需要一个功能:一个程序启动另外一个程序并且当前的程序退出,所以第一时间使用到了system函数,但是没有起到想要的效果,后来查阅资料,换成了exec函数实现了功能,在这里记录一下相关的知识点,权当做笔记使用。

比如当前执行的程序名称为main,在条件满足的时候需要启动a.out程序,并且退出main程序。

1、main程序由main.c编译而来,且main.c为:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, const char *argv[])
{
    int ret = 0, cnt = 0;
    printf("Hi,I am main\r\n");
    while(1)
    {
        cnt += 1;
        printf("I am main, and cnt = %d\r\n", cnt);
        if(cnt % 5 == 0)
        {
            ret = system("./a.out");
            printf("I am main, and ret = %d\r\n", ret);
        }
        usleep(800000);                                                     
    }
    return 0;
}

2、a.out程序由a.c编译而来,且a.c为:

#include <stdio.h>                                                          

int main(int argc, const char **argv)
{
    int cnt = 0;
    
    while(1)
    {
        cnt += 1;
        printf("I am a.out, cnt = %d\r\n", cnt);
        sleep(1);
    }
    return 1;
}

所以,运行的效果为:

注意终端中的 ctrl + c 的效果,很明显,两个程序都在运行中,效果显然不是需要的。

将main.c中的system改为execv函数

在此运行后的效果为:

由此可以看出,main程序已经退出,并且a.out程序在运行中。

以上只是对两个函数的简单的使用,并没有涉及复杂的东西,见好就收!

一、shell 中的 exec 两种用法:

1、exec 命令:

    代替shell程序,exec命令在执行时会把当前的shell process关闭,然后换到后面的命令继续执行。比如 exec ls,终端执行完ls命令后退出。
2、exec 文件重定向:

    可以使用命令 exec ls >> ls.txt 后,可以在当前路径下找到 ls.txt,并且ls.txt文件中的内容即为当前目录下的文件的名称。

 

二、exec与.(source)的异同: 
1、exec和.(source)都可以在终端来执行程序或者脚本
2、exec执行时候会关闭当前shell进程,并且fork一个相同pid的shell进程来执行,系统调用新的exec的process来替代原来的进程执行。没有新的进程创建,原来进程的代码段、数据段、堆栈都被新的process所代替。
3、.(source)执行的时候是当前shell环境下执行,执行完成后把状态返回给当前的shell。

三,system与exec的区别
1、system()和exec()都可以执行进程外的命令,system是在原进程上开辟了一个新的进程,但是exec是用新进程(命令)覆盖了原有的进程。
2、system()和exec()都有能产生返回值,system的返回值并不影响原有进程,但是exec的返回值影响了原进程。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青椒*^_^*凤爪爪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值